实现的目标(一对多)
实现针对课程实现:课程类型、难度级别、是否隐藏三个方式的筛选
每一个视频文件有针对一个课程类型、一个难度级别、是否隐藏
设计数据库如下:
PHP;">
# 视频分类表格
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',)
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文件:
PHP;">
from django.urls import re_path
urlpatterns = [
path('admin/',admin.site.urls),path('video/',views.video),# 通过正则表达式添加三个字段,从前台获取当前选择项
re_path('video-(?P(\d+))-(?P(\d+))-(?P(\d+))',
PHP;">
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,'隐藏'))
# 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,}
)
PHP;">
<Meta charset="UTF-8">
Title
筛选
{% if kwargs.Video_type_id == 0%}
{% else %}
全部
{% endif %}
{% for i in VideoType_list %}
{% if i.id == kwargs.Video_type_id %}
{% else %}
{{ i.Video_Type }}
{% endif %}
{% endfor %}
{% if kwargs.Video_dif_id == 0%}
{% else %}
全部
{% endif %}
{% for i in VideoDif_list %}
{% if i.id == kwargs.Video_dif_id %}
{% else %}
{{ i.Video_dif }}
{% endif %}
{% endfor %}
{% if kwargs.display == 0 %}
全部
{% else %}
全部
{% endif %}
{% for item in display_list %}
{% if item.id == kwargs.display %}
{{ item.name }}
{% else %}
{{ item.name }}
{% endif %}
{% endfor %}
结果
{% for row in video_list %}
{{ row.Video_title }}
{% endfor %}