实现的目标(一对多)
实现针对课程实现:课程类型、难度级别、是否隐藏三个方式的筛选
每一个视频文件有针对一个课程类型、一个难度级别、是否隐藏
设计数据库如下:
# 视频分类表格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_pathurlpatterns = [ 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, } )
新闻热点
疑难解答