Django 标签筛选的实现代码(一对多、多对多)

实现的目标(一对多)

实现针对课程实现:课程类型、难度级别、是否隐藏三个方式的筛选

每一个视频文件有针对一个课程类型、一个难度级别、是否隐藏

设计数据库如下:

# 视频分类表格 class VideoType(models.Model): Video_Type = models.CharField(max_length=50) class Meta: verbose_name_plural = '视频分类' def __str__(self): return self.Video_Type # 视频难度表格 class VideoDif(models.Model): Video_dif = models.CharField(max_length=50) class Meta: verbose_name_plural = '视频难度' def __str__(self): return self.Video_dif # 视频:ID、视频图片、视频名称、视频简介、视频地址、视频分类、视频难度、权重、是否显示 class Video(models.Model): Video_img = models.CharField(max_length=100) Video_title = models.CharField(max_length=100) Video_text = models.TextField() Video_type_id = models.ForeignKey('VideoType', on_delete=models.CASCADE,) Video_dif_id = models.ForeignKey('VideoDif', on_delete=models.CASCADE,) Video_qz = models.IntegerField(default=0) display_choice = ( (1, '显示'), (2, '隐藏'), ) display = models.IntegerField(verbose_name='状态', choices=display_choice, default=1) class Meta: verbose_name_plural = '视频'

URL文件:

from django.urls import re_path urlpatterns = [ path('admin/', admin.site.urls), path('video/', views.video), # 通过正则表达式添加三个字段,从前台获取当前选择项 re_path('video-(?P<Video_type_id>(\d+))-(?P<Video_dif_id>(\d+))-(?P<display>(\d+))', views.video),

后台程序文件:

def video(request,*args,**kwargs): # 给后台筛选数据库使用 condition = {} # kwargs是从前台URL获取的键值对,如果第一次访问,针对字典做一个初始化 if not kwargs: kwargs ={ 'Video_type_id':0, 'Video_dif_id':0, 'display':0, } # 依次取出kwargs字典中传来的值 for k, v in kwargs.items(): # 首先将传来的值变为数字类型 temp = int(v) kwargs[k] = temp # 如果kwargs中有值,循环将值赋予condition列表 if temp: condition[k] = temp # 从数据库中获取视频类型的列表 VideoType_list = models.VideoType.objects.all() # 从数据库中获取视频难度的列表 VideoDif_list = models.VideoDif.objects.all() # 从数据库中视频列表中,获取是否显示的字段的内容,是一个元组形式的:((1, '显示'), (2, '隐藏')) # map后形成一个map对象:{'id':1,'name':'显示'} # 最后list转换为列表:[{'id': 1, 'name': '显示'}, {'id': 2, 'name': '隐藏'}] display_list = list(map(lambda x:{'id':x[0],'name':x[1]},models.Video.display_choice)) # 根据condition列表筛选数据库中的视频列表 video_list = models.Video.objects.filter(**condition) return render( request, 'video1.html', { 'VideoType_list': VideoType_list, 'VideoDif_list': VideoDif_list, 'kwargs': kwargs, 'video_list': video_list, 'display_list': display_list, } )

前台展示文件:

<!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> <h1>筛选</h1> <div> {% if kwargs.Video_type_id == 0%} <a href="/video-0-{{ kwargs.Video_dif_id }}-{{ kwargs.display }}">全部</a> {% else %} <a href="/video-0-{{ kwargs.Video_dif_id }}-{{ kwargs.display }}" >全部</a> {% endif %} {% for i in VideoType_list %} {% if i.id == kwargs.Video_type_id %} <a href="/video-{{ i.id }}-{{ kwargs.Video_dif_id }}-{{ kwargs.display }}">{{ i.Video_Type }}</a> {% else %} <a href="/video-{{ i.id }}-{{ kwargs.Video_dif_id }}-{{ kwargs.display }}" >{{ i.Video_Type }}</a> {% endif %} {% endfor %} </div> <div> {% if kwargs.Video_dif_id == 0%} <a href="/video-{{ kwargs.Video_type_id }}-0-{{ kwargs.display }}">全部</a> {% else %} <a href="/video-{{ kwargs.Video_type_id }}-0-{{ kwargs.display }}" >全部</a> {% endif %} {% for i in VideoDif_list %} {% if i.id == kwargs.Video_dif_id %} <a href="/video-{{ kwargs.Video_type_id }}-{{ i.id }}-{{ kwargs.display }}">{{ i.Video_dif }}</a> {% else %} <a href="/video-{{ kwargs.Video_type_id }}-{{ i.id }}-{{ kwargs.display }}" >{{ i.Video_dif }}</a> {% endif %} {% endfor %} </div> <div> {% if kwargs.display == 0 %} <a href="/video-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}-0" >全部</a> {% else %} <a href="/video-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}-0" >全部</a> {% endif %} {% for item in display_list %} {% if item.id == kwargs.display %} <a href="/video-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}-{{ item.id }}" >{{ item.name }}</a> {% else %} <a href="/video-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}-{{ item.id }}" >{{ item.name }}</a> {% endif %} {% endfor %} </div> </div> <div> <h1>结果</h1> <div> {% for row in video_list %} <p>{{ row.Video_title }}</p> {% endfor %} </div> </div> </body> </html>

前台通过变化active标签,实现选中的显示,通过a标签中的数字控制后台筛选操作

实现的目标(多对多)

实现针对课程实现:课程方向、课程类型、难度级别三个方式的筛选

其中每个课程方向中包含有多个课程类型,选择课程方向后,筛选课程方向包含的所有课程类型

每一个视频文件有针对一个课程类型、一个难度级别

设计数据库如下,在一对多的基础上增加了一个多对多的课程方向表:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cb94b0cf3ae33ebb20bcf60c0ac96e5f.html