django組合搜索實(shí)現(xiàn)過程詳解(附代碼)
一.簡(jiǎn)介
- # 組合搜索
- # 技術(shù)方向:自動(dòng)化,測(cè)試,運(yùn)維,前端
- # 分類:Python Linux JavaScript OpenStack Node.js GO
- # 級(jí)別:初級(jí) 中級(jí) 高級(jí) 骨灰級(jí)
有4張表:
Direction(技術(shù)方向標(biāo)),Classification(技術(shù)分類表),Level(難度級(jí)別表),Video(視頻表)
它們的關(guān)系是:
Direction與Classification多對(duì)多關(guān)系
Video與Classification,Level是一對(duì)多關(guān)系
最終要實(shí)現(xiàn)的結(jié)果如下圖:

二.models代碼
class Direction(models.Model):
"""
技術(shù)方向:自動(dòng)化,測(cè)試,運(yùn)維,前端
"""
name = models.CharField(verbose_name='名稱', max_length=32)
classification = models.ManyToManyField('Classification')
class Meta:
# 重命名表名,不要自動(dòng)添加的app名
db_table = 'Direction'
verbose_name_plural = '方向(視頻方向)'
def __str__(self):
return self.name
class Classification(models.Model):
"""
分類:Python Linux JavaScript OpenStack Node.js GO
"""
name = models.CharField(verbose_name='名稱', max_length=32)
class Meta:
db_table = 'Classification'
verbose_name_plural = '分類(視頻分類)'
def __str__(self):
return self.name
class Level(models.Model):
title = models.CharField(max_length=32)
class Meta:
db_table = 'Level'
verbose_name_plural = '難度級(jí)別'
def __str__(self):
return self.title
class Video(models.Model):
status_choice = (
(1, '下線'),
(2, '上線'),
)
status = models.IntegerField(verbose_name='狀態(tài)', choices=status_choice, default=1)
level = models.ForeignKey(Level)
classification = models.ForeignKey('Classification', null=True, blank=True)
weight = models.IntegerField(verbose_name='權(quán)重(按從大到小排列)', default=0)
title = models.CharField(verbose_name='標(biāo)題', max_length=32)
summary = models.CharField(verbose_name='簡(jiǎn)介', max_length=32)
# img = models.ImageField(verbose_name='圖片', upload_to='./static/images/Video/')
img = models.CharField(verbose_name='圖片', max_length=32)
href = models.CharField(verbose_name='視頻地址', max_length=256)
create_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'Video'
verbose_name_plural = '視頻'
def __str__(self):
return self.title
三.url路由代碼
urlpatterns=[
url(r'^admin',admin.site.urls),
#利用的是有名分組的方法,分別獲取不同的id
url(r'^video-(?P<direction_id>(\d+))-(?P<classification_id>(\d+))-(?P<level_id>(\d+)).html$', views.video,
name='video')
]
四.視圖代碼
def video(request,*args,**kwargs):
condition = {}
for k, v in kwargs.items():
temp = int(v)
kwargs[k] = temp
print(kwargs) # (?P<direction_id>(\d+))-(?P<classification_id>(\d+))-(?P<level_id>(\d+))
# 構(gòu)造查詢字典
direction_id = kwargs.get('direction_id')
classification_id = kwargs.get('classification_id')
level_id = kwargs.get('level_id')
# 獲取所有的技術(shù)方向
direction_list = models.Direction.objects.all()
# 當(dāng)沒有選擇技術(shù)方向時(shí),就獲取所有分類
if direction_id == 0:
class_list = models.Classification.objects.all()
# 當(dāng)沒有選擇分類時(shí),不做什么
if classification_id == 0:
pass
else:
# 否則就將分類id放入字典
condition['classification_id'] = classification_id
else:
# 當(dāng)選擇了技術(shù)方向id時(shí),查詢出該技術(shù)方向下的所有分類
direction_obj = models.Direction.objects.filter(id=direction_id).first()
class_list = direction_obj.classification.all()
# 只獲取該方向下的分類id
vlist = direction_obj.classification.all().values_list('id')
# 下面的代碼為了生成condition是傳入的一對(duì)多查詢id,如:{'classification_id__in': (1, 2, 3), 'level_id': 1}
if not vlist:
classification_id_list = []
else:
# 將vlist轉(zhuǎn)換成列表
classification_id_list = list(zip(*vlist))[0]
if classification_id == 0:
condition['classification_id__in'] = classification_id_list
else:
if classification_id in classification_id_list:
condition['classification_id'] = classification_id
else:
#指定技術(shù)方向:[1,2,3] 分類:5
kwargs['classification_id'] = 0
condition['classification_id__in'] = classification_id_list
if level_id == 0:
pass
else:
condition['level_id'] = level_id
level_list = models.Level.objects.all()
video_list = models.Video.objects.filter(**condition)
# 技術(shù)方向的queryset對(duì)象列表
print(direction_list)
# 分類的queryset對(duì)象列表
print(class_list)
# 等級(jí)的queryset對(duì)象列表
print(level_list)
# video的queryset對(duì)象列表
print(video_list)
# 技術(shù)方向的id,分類的id,等級(jí)的id組成的字典
print(kwargs)
return render(
request,
'video.html',
{
'direction_list':direction_list,
'class_list':class_list,
'level_list':level_list,
'video_list':video_list,
'kwargs':kwargs,
}
)
五.模板代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.condition a {
display: inline-block;
padding: 5px 8px;
border: 1px solid #dddddd;
}
.condition a.active {
background-color: coral;
color: white;
}
</style>
</head>
<body>
<div class="condition">
<h1>篩選</h1>
<div>
{% if kwargs.direction_id == 0 %}
{#反向解析#}
<a href="{% url " rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" video" direction_id=0 classification_id=kwargs.classification_id level_id=kwargs.level_id %}"
class="active">全部</a>
{% else %}
<a href="{% url " rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" video" direction_id=0 classification_id=kwargs.classification_id level_id=kwargs.level_id %}">全部</a>
{% endif %}
{% for item in direction_list %}
{% if item.id == kwargs.direction_id %}
<a href="{% url " rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" video" direction_id=item.id classification_id=kwargs.classification_id level_id=kwargs.level_id %}"
class="active">{{ item.name }}</a>
{% else %}
<a href="{% url " rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" video" direction_id=item.id classification_id=kwargs.classification_id level_id=kwargs.level_id %}">{{ item.name }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if kwargs.classification_id == 0 %}
<a href="/video-{{ kwargs.direction_id }}-0-{{ kwargs.level_id }}.html" rel="external nofollow" rel="external nofollow" class="active">全部</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-0-{{ kwargs.level_id }}.html" rel="external nofollow" rel="external nofollow" >全部</a>
{% endif %}
{% for item in class_list %}
{% if item.id == kwargs.classification_id %}
<a href="/video-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}.html" rel="external nofollow" rel="external nofollow"
class="active">{{ item.name }}</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}.html" rel="external nofollow" rel="external nofollow" >{{ item.name }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if kwargs.level_id == 0 %}
<a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-0.html" rel="external nofollow" rel="external nofollow" class="active">全部</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-0.html" rel="external nofollow" rel="external nofollow" >全部</a>
{% endif %}
{% for item in level_list %}
{% if item.id == kwargs.level_id %}
<a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-{{ item.id }}.html" rel="external nofollow" rel="external nofollow"
class="active">{{ item.title }}</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-{{ item.id }}.html" rel="external nofollow" rel="external nofollow" >{{ item.title }}</a>
{% endif %}
{% endfor %}
</div>
</div>
<div>
<h1>結(jié)果</h1>
{% for row in video_list %}
<div>{{ row.title }}</div>
{% endfor %}
</div>
</body>
</html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch中的named_parameters()和parameters()
這篇文章主要介紹了pytorch中的named_parameters()和parameters()使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Python中的錯(cuò)誤和異常處理簡(jiǎn)單操作示例【try-except用法】
這篇文章主要介紹了Python中的錯(cuò)誤和異常處理簡(jiǎn)單操作,結(jié)合實(shí)例形式分析了Python中try except在錯(cuò)誤與異常處理中的用法,需要的朋友可以參考下2017-07-07
基于python分享一款地理數(shù)據(jù)可視化神器keplergl
這篇文章主要介紹了分享一款地理數(shù)據(jù)可視化神器keplergl,keplergl是由Uber開源的一款地理數(shù)據(jù)可視化工具,通過keplergl我們可以在Jupyter?notebook中使用,下文分享需要的小伙伴可以參考一下2022-02-02
python接口調(diào)用已訓(xùn)練好的caffe模型測(cè)試分類方法
今天小編就為大家分享一篇python接口調(diào)用已訓(xùn)練好的caffe模型測(cè)試分類方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-08-08
Python?Decorator裝飾器的創(chuàng)建方法及常用場(chǎng)景分析
這篇文章主要介紹了Python?Decorator裝飾器的創(chuàng)建方法及常用場(chǎng)景,裝飾器可以分成方法裝飾器和類裝飾器,他們的區(qū)別是一個(gè)是用函數(shù)實(shí)現(xiàn)的裝飾器,一個(gè)是用類實(shí)現(xiàn)的裝飾器,他們也都能在方法和類上進(jìn)行裝飾,需要的朋友可以參考下2022-07-07
windows+vscode安裝paddleOCR運(yùn)行環(huán)境的步驟
這篇文章主要介紹了windows+vscode安裝paddleOCR運(yùn)行環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
python語(yǔ)法 range() 序列類型range
這篇文章主要介紹了python語(yǔ)法 range() 序列類型range,range是一種序列類型,range類型用于表示不可變的整數(shù)序列,下面小編整理了簡(jiǎn)單內(nèi)容,需要的小伙伴可以參考一下2022-01-01

