Django 组合搜索
表结构
from django.db import models class Direction(models.Model): """ 方向:自动化,测试,运维,前端 """ name = models.CharField(verbose_name='名称', max_length=32) classification = models.ManyToManyField('Classification') class Meta: db_table = 'Direction' verbose_name_plural = '方向(视频方向)' def __str__(self): return self.name class Classification(models.Model): """ 分类:Python Linux JavaScript OpenStack Node.js """ 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: verbose_name_plural = '难度级别' def __str__(self): return self.title class Video(models.Model): status_choice = ( (1, '下线'), (2, '上线'), ) status = models.IntegerField(verbose_name='状态', choices=status_choice, default=1) level = models.ForeignKey(Level,on_delete=models.CASCADE) classification = models.ForeignKey('Classification', null=True, blank=True,on_delete=models.CASCADE) weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0) title = models.CharField(verbose_name='标题', max_length=32) summary = models.CharField(verbose_name='简介', 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
版本一(简单版)
from django.shortcuts import render from app01 import models def video(request,*args,**kwargs): condition ={ # 'level_id':1, # 'classification_id':2, } for k,v in kwargs.items(): temp = int(v) kwargs[k] = temp if temp: condition[k] = temp class_list = models.Classification.objects.all() # 获取视频分类列表 level_list = models.Level.objects.all() # 获取视频难度列表 ''' status_choice = ( (1, '下线'), (2, '上线'), ) ''' status_list = list(map(lambda x:{'id':x[0],'name':x[1]},models.Video.status_choice)) video_list = models.Video.objects.filter(**condition) # 获取视频 return render( request, 'video.html', { 'class_list':class_list, 'level_list':level_list, 'status_list':status_list, 'kwargs':kwargs, 'video_list':video_list, } )
from django.contrib import admin from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), re_path('video-(?P<classification_id>(\d+))-(?P<level_id>(\d+))-(?P<status>(\d+))/', views.video), ]
<!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: red; color:white; } </style> </head> <body> <div class="condition"> <h1>筛选</h1> {# -----------视频分类----------- #} <div> {% if kwargs.classification_id == 0 %} <a class="active" href="/video-0-{{ kwargs.level_id }}-{{ kwargs.status }}/">全部</a> {% else %} <a href="/video-0-{{ kwargs.level_id }}-{{ kwargs.status }}/">全部</a> {% endif %} {% for item in class_list %} {% if item.id == kwargs.classification_id %} <a href="/video-{{ item.id }}-{{ kwargs.level_id }}-{{ kwargs.status }}/" class="active">{{ item.name }}</a> {% else %} <a href="/video-{{ item.id }}-{{ kwargs.level_id }}-{{ kwargs.status }}/">{{ item.name }}</a> {% endif %} {% endfor %} </div> {# -----------难度等级分类----------- #} <div> {% if kwargs.level_id == 0 %} <a class="active" href="/video-{{ kwargs.classification_id }}-0-{{ kwargs.status }}/">全部</a> {% else %} <a href="/video-{{ kwargs.classification_id }}-0-{{ kwargs.status }}/">全部</a> {% endif %} {% for item in level_list %} {% if item.id == kwargs.level_id %} <a href="/video-{{ kwargs.classification_id }}-{{ item.id }}-{{ kwargs.status }}/" class="active">{{ item.title }}</a> {% else %} <a href="/video-{{ kwargs.classification_id }}-{{ item.id }}-{{ kwargs.status }}/">{{ item.title }}</a> {% endif %} {% endfor %} </div> {# -----------状态----------- #} <div> {% if kwargs.status == 0 %} <a class="active" href="/video-{{ kwargs.classification_id }}-{{ kwargs.level_id }}-0/">全部</a> {% else %} <a href="/video-{{ kwargs.classification_id }}-{{ kwargs.level_id }}-0/">全部</a> {% endif %} {% for item in status_list %} {% if item.id == kwargs.status %} <a class="active" href="/video-{{ kwargs.classification_id }}-{{ kwargs.level_id }}-{{ item.id }}/">{{ item.name }}</a> {% else %} <a href="/video-{{ kwargs.classification_id }}-{{ kwargs.level_id }}-{{ item.id }}/">{{ item.name }}</a> {% endif %} {% endfor %} </div> </div> <div> <h1>结果</h1> <div> {% for row in video_list %} <div>{{ row.title }}</div> {% endfor %} </div> </div> </body> </html>
\
版本二(复杂版)
from django.shortcuts import render from app01 import models def video2(request,*args,**kwargs): condition ={} for k,v in kwargs.items(): temp = int(v) kwargs[k] = temp if temp and k != 'direction_id': condition[k] = temp # print(kwargs) # video2-(?P<direction_id>(\d+))-(?P<classification_id>(\d+))-(?P<level_id>(\d+)) # 构造查询字典 direction_id = kwargs.get('direction_id') classification_id = kwargs.get('classification_id') level_id = kwargs.get('direction_id') direction_list = models.Direction.objects.all() if direction_id == 0: class_list = models.Classification.objects.all() if classification_id == 0: pass else: condition['classification_id'] = classification_id else: direction_obj = models.Direction.objects.filter(id=direction_id).first() #拿到这个方向对象 class_list = direction_obj.classification.all() # 方向下的所有分类对象 vlist = direction_obj.classification.all().values_list('id') # 找到这个方向下所有分类ID # print(v) # <QuerySet [(1,), (3,), (4,)]> if not vlist: classification_id_list = [] else: classification_id_list = list(zip(*vlist))[0] # 把这个方向下的分类ID转换成ID列表 if classification_id == 0: condition['classification_id__in'] = classification_id_list else: # 如果输入的分类id在这个方向里的分类ID列表中,则按这个输入的分类id进一步查找 if classification_id in classification_id_list: condition['classification_id'] = classification_id else:# 如果输入的分类id不在这个方向里的分类ID列表中,则按这个方向里的分类ID列表查找 kwargs['classification_id'] = 0 # 输入的分类id不在这个方向的id列表里,则把查询条件中的分类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) print(video_list) return render( request, 'video2.html', { 'direction_list':direction_list, 'class_list':class_list, 'level_list':level_list, 'video_list':video_list, 'kwargs':kwargs, } ) """ 如果:direction_id = 0 *列出所有的分类 如果 classesfication_id = 0: pass else: condition['classification_id'] = classification_id 否则:direction_id != 0 *列出列表当前方向下的所有的分类 如果 classesfication_id = 0: 获取当前方向下的所有分类 [1,2,3] condition['classification_id__in'] = [1,2,3] else:classesfication_id != 0: 获取当前方向下的所有分类 [1,2,3] classesfication_id 是否在 [1,2,3] condition['classification_id'] = classification_id else: condition['classification_id__in'] = [1,2,3] """
from django.contrib import admin from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), re_path('video2-(?P<direction_id>(\d+))-(?P<classification_id>(\d+))-(?P<level_id>(\d+))/', views.video2,name='video2'), ]
<!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: red; color:white; } </style> </head> <body> <div class="condition"> <h1>筛选</h1> {# -----------方向分类----------- #} <div> {% if kwargs.direction_id == 0 %} <a class="active" href="{% url "video2" direction_id=0 classification_id=kwargs.classification_id level_id=kwargs.level_id %}">全部</a> {% else %} <a href="{% url "video2" 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 "video2" direction_id=item.id classification_id=kwargs.classification_id level_id=kwargs.level_id %}" class="active">{{ item.name }}</a> {% else %} <a href="{% url "video2" 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 class="active" href="{% url "video2" direction_id=kwargs.direction_id classification_id=0 level_id=kwargs.level_id %}">全部</a> {% else %} <a href="{% url "video2" direction_id=kwargs.direction_id classification_id=0 level_id=kwargs.level_id %}">全部</a> {% endif %} {% for item in class_list %} {% if item.id == kwargs.classification_id %} <a href="/video2-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}/" class="active">{{ item.name }}</a> {% else %} <a href="/video2-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}/">{{ item.name }}</a> {% endif %} {% endfor %} </div> {# -----------难度等级分类----------- #} <div> {% if kwargs.level_id == 0 %} <a class="active" href="{% url "video2" direction_id=kwargs.direction_id classification_id=kwargs.classification_id level_id=0 %}">全部</a> {% else %} <a href="{% url "video2" direction_id=kwargs.direction_id classification_id=kwargs.classification_id level_id=0 %}">全部</a> {% endif %} {% for item in level_list %} {% if item.id == kwargs.level_id %} <a href="/video2-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-{{ item.id }}/" class="active">{{ item.title }}</a> {% else %} <a href="/video2-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-{{ item.id }}/">{{ item.title }}</a> {% endif %} {% endfor %} </div> </div> <div> <h1>结果</h1> {% for row in video_list %} <div> {{ row.title }} </div> {% endfor %} </div> </body> </html>


浙公网安备 33010602011771号