组合搜索
1:n的情况
1. 模型:视频、分类、级别
2. 关系:视频(n):分类(1)、视频(n):级别(1)
3. 新建一个项目 mysite
4. 新建一个应用 app01
5. 在mysite项目下新建一个文件夹 static
6. 在mysite项目下新建一个文件夹 templates (备注:如果使用IDE创建项目,则该文件夹会自动生成)
7. 在app01应用下新建一个文件夹 templatetags
8. 在models.py中新增模型类
from django.db import models class Level(models.Model): """级别表""" name = models.CharField(max_length=32) def __str__(self): return self.name class Category(models.Model): """分类表""" name = models.CharField(max_length=32) def __str__(self): return self.name class Video(models.Model): """视频表""" lv = models.ForeignKey(Level) cg = models.ForeignKey(Category) 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/') href = models.CharField(verbose_name='视频地址', max_length=256) create_date = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title
9. 在admin.py中注册模型类
from django.contrib import admin from app01 import models admin.site.register(models.Level) admin.site.register(models.Category) admin.site.register(models.Video)
10. 修改mysite应用下的settings.py文件
""" 第1步 添加应用""" INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', ] """ 第2步 配置静态文件路径""" STATIC_URL = '/static/' STATICFILES_DIRS=( os.path.join(BASE_DIR,'static'), )
11. 在mysite项目下的urls.py文件中新增路由
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^video1-(?P<cg_id>\d+)-(?P<lv_id>\d+).html', views.video1,name='vvv'), ]
12. 在templates文件夹下新建一个video.html文件
{% load xx %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .filter a{ display: inline-block; margin: 5px; padding: 3px 5px; } .filter a.active{ background-color: brown; color: white; } </style> </head> <body> <h1>筛选条件</h1> <div class="filter"> <div> {% total_tag arg_dict "cg_id" %} {% for item in category_list %} {% category_tag item arg_dict %} {% endfor %} </div> <div> {% total_tag arg_dict "lv_id" %} {% for item in level_list %} {% level_tag item arg_dict %} {% endfor %} </div> </div> <h1>查询结果</h1> <div class="content"> {% for row in result %} <div style="width: 100px;height: 260px;float: left;"> <img style="width: 100px;height: 150px;" src="{{ row.img }}"> <p>{{ row.title }}</p> <p>{{ row.summary }}</p> </div> {% endfor %} </div> </body> </html>
13. 在app01应用下的views.py文件中新增视图函数video1
from django.shortcuts import render, HttpResponse from app01 import models def video1(request, *args, **kwargs): """ 通过别名vvv反向生成url from django.urls import reverse url = reverse('vvv', kwargs={'cg_id': 1, 'lv_id': 2}) print(url) """ condition = {} for k, v in kwargs.items(): if v == '0': pass else: condition[k] = v category_list = models.Category.objects.all() # 获取所有分类 level_list = models.Level.objects.all() # 获取所有级别 result = models.Video.objects.filter(**condition) return render(request, 'video1.html', { 'category_list': category_list, 'level_list': level_list, 'result': result, 'arg_dict': kwargs })
14. 在templatetags文件夹下新建xx.py
from django import template from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag def category_tag(obj,arg_dict): """ 生成分类的a标签 """ # 通过别名vvv反向生成url from django.urls import reverse url = reverse('vvv', kwargs={'cg_id': obj.id, 'lv_id': arg_dict.get('lv_id')}) if str(obj.id) == arg_dict.get('cg_id'): # 获取当前URL tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name) return mark_safe(tag) else: tag = "<a href='%s'>%s</a>" % (url, obj.name) return mark_safe(tag) @register.simple_tag def level_tag(obj,arg_dict): """ 生成级别的a标签 """ from django.urls import reverse url = reverse('vvv', kwargs={'cg_id': arg_dict.get('cg_id'), 'lv_id': obj.id}) if str(obj.id) == arg_dict.get('lv_id'): tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name) return mark_safe(tag) else: tag = "<a href='%s'>%s</a>" % (url, obj.name) return mark_safe(tag) @register.simple_tag def total_tag(arg_dict,key): """ 生成全部的a标签 """ from django.urls import reverse if key == 'cg_id': url = reverse('vvv', kwargs={'cg_id': 0, 'lv_id': arg_dict.get('lv_id')}) elif key == 'lv_id': url = reverse('vvv', kwargs={'cg_id': arg_dict.get('cg_id'), 'lv_id': 0}) else: url = "" tag = "<a href='%s'>全部</a>" % (url,) return mark_safe(tag)
备注:自定义tagde使用
n:n的情况
1. 模型:视频、分类、级别、方向
2. 关系:方向(n):分类(n)
3. 新建一个项目 mysite
4. 新建一个应用 app01
5. 在mysite项目下新建一个文件夹 static
6. 在mysite项目下新建一个文件夹 templates (备注:如果使用IDE创建项目,则该文件夹会自动生成)
7. 在app01应用下新建一个文件夹 templatetags
8. 在models.py中新增模型类
from django.db import models class Level(models.Model): """ 级别表 """ name = models.CharField(max_length=32) def __str__(self): return self.name class Direction(models.Model): """ 反向表表 """ name = models.CharField(max_length=32) d_2_c = models.ManyToManyField('Category') class Category(models.Model): """ 分类表 """ name = models.CharField(max_length=32) def __str__(self): return self.name class Video(models.Model): """ 视频表 """ lv = models.ForeignKey(Level) cg = models.ForeignKey(Category) 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/') href = models.CharField(verbose_name='视频地址', max_length=256) create_date = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title
9. 在admin.py中注册模型类
from django.contrib import admin from app01 import models admin.site.register(models.Level) admin.site.register(models.Category) admin.site.register(models.Video) admin.site.register(models.Direction)
10. 修改mysite应用下的settings.py文件
"""第1步 添加应用""" INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', ] """第2步 添加静态文件路径""" STATIC_URL = '/static/' STATICFILES_DIRS=( os.path.join(BASE_DIR,'static'), )
11. 在mysite项目下的urls.py文件中新增路由
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^video2-(?P<dr_id>\d+)-(?P<cg_id>\d+)-(?P<lv_id>\d+).html', views.video2,name='vvv2'), ]
12. 在templates文件夹下新建一个video2.html文件
{% load xx %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .filter a{ display: inline-block; margin: 5px; padding: 3px 5px; } .filter a.active{ background-color: brown; color: white; } </style> </head> <body> <h1>筛选条件</h1> <div class="filter"> <div> {% total_tag_2 arg_dict 'dr_id' %} {% for item in drection_list %} <!-- if判断,如果kwargs.dr_id = item.id - 加入样式 else: - 无样式 --> {% dr_tag item arg_dict %} {% endfor %} </div> <div> {% total_tag_2 arg_dict 'cg_id' %} {% for item in category_list %} {% cg_tag item arg_dict %} {% endfor %} </div> <div> {% total_tag_2 arg_dict 'lv_id' %} {% for item in level_list %} {% lv_tag item arg_dict %} {% endfor %} </div> </div> <h1>查询结果</h1> <div class="content"> {% for row in result %} <div style="width: 100px;height: 260px;float: left;"> <img style="width: 100px;height: 150px;" src="{{ row.img }}"> <p>{{ row.title }}</p> <p>{{ row.summary }}</p> </div> {% endfor %} </div> </body> </html>
13. 在app01应用下的views.py文件中新增视图函数video2
from django.shortcuts import render, HttpResponse from app01 import models def video2(request, *args, **kwargs): # 0-0-0.html # 0-1-0.html # 1-0-0.html # 1-1-0.html [1,2,3,4] # 2-1-0.html [2,3,4]
dr_id = kwargs.get('dr_id') cg_id = kwargs.get('cg_id') lv_id = kwargs.get('lv_id') condition = {} drection_list = models.Direction.objects.all() level_list = models.Level.objects.all() if dr_id == "0": # 未选择方向 category_list = models.Category.objects.all() if cg_id == '0': # 未选择分类 pass else: # 选择分类 # models.Video.objects.filter(cg_id=cg_id) condition['cg_id'] = cg_id else: # 选择了方向 category_list = models.Category.objects.filter(direction=dr_id) temp = category_list.values_list('id') cg_id_list = list(zip(*temp))[0] if cg_id == '0': # 未选择分类 condition['cg_id__in'] = cg_id_list else: # 选择了分类 if int(cg_id) in cg_id_list: condition['cg_id'] = cg_id else: condition['cg_id__in'] = cg_id_list kwargs['cg_id'] = '0' if lv_id == '0': pass else: condition['lv_id'] = lv_id result = models.Video.objects.filter(**condition) print(result) return render(request, 'video2.html', { 'drection_list': drection_list, 'level_list': level_list, 'category_list': category_list, 'arg_dict':kwargs })
14. 在templatetags文件夹下新建xx.py
from django import template from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag def dr_tag(obj,arg_dict): """ 生成方向的a标签 """ from django.urls import reverse url = reverse('vvv2', kwargs={'dr_id': obj.id, 'cg_id': arg_dict.get('cg_id'), 'lv_id': arg_dict.get('lv_id')}) if str(obj.id) == arg_dict.get('dr_id'): # 获取当前URL tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name) return mark_safe(tag) else: tag = "<a href='%s'>%s</a>" % (url, obj.name) return mark_safe(tag) @register.simple_tag def cg_tag(obj,arg_dict): """ 生成分类的a标签 """ from django.urls import reverse url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': obj.id, 'lv_id': arg_dict.get('lv_id')}) if str(obj.id) == arg_dict.get('cg_id'): # 获取当前URL tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name) return mark_safe(tag) else: tag = "<a href='%s'>%s</a>" % (url, obj.name) return mark_safe(tag) @register.simple_tag def lv_tag(obj,arg_dict): """ 生成级别的a标签 """ from django.urls import reverse url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': arg_dict.get('cg_id'), 'lv_id': obj.id}) if str(obj.id) == arg_dict.get('lv_id'): # 获取当前URL tag = "<a class='active' href='%s'>%s</a>" %(url,obj.name) return mark_safe(tag) else: tag = "<a href='%s'>%s</a>" % (url, obj.name) return mark_safe(tag) @register.simple_tag def total_tag_2(arg_dict,key): """ 生成全部的a标签 """ from django.urls import reverse if key == 'dr_id': url = reverse('vvv2', kwargs={'dr_id': 0, 'cg_id': arg_dict.get('cg_id'), 'lv_id': arg_dict.get('lv_id')}) elif key == 'cg_id': url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': 0, 'lv_id': arg_dict.get('lv_id')}) elif key == 'lv_id': url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': arg_dict.get('cg_id'), 'lv_id': 0}) else: url = '' if arg_dict.get(key) == '0': tag = "<a class='active' href='%s'>全部</a>" % (url,) else: tag = "<a href='%s'>全部</a>" % (url,) return mark_safe(tag)