urls:
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
re_path(r'^video-(?P<direction_id>(\d+))-(?P<classes_id>(\d+))-(?P<level_id>(\d+)).html$',views.video,name='video2'),#使用关键字正则表达式匹配
]
models:
class Direction(models.Model):
name = models.CharField(max_length=20)
class Meta:
db_table = 'direction'
verbose_name_plural = '方向'
def __str__(self):
return self.name
class Classes(models.Model):
name = models.CharField(max_length=20)
classes = models.ManyToManyField('Direction',related_name='classes')
class Meta:
db_table = 'classes'
verbose_name_plural = '课程'
def __str__(self):
return self.name
class Level(models.Model):
title = models.CharField(max_length=20)
level = models.ManyToManyField('Classes',related_name='level')
class Meta:
db_table = 'level'
verbose_name_plural = '级别'
def __str__(self):
return self.title
class Video(models.Model):
status = (
(0,'下线'),
(1,'上线')
)
video_status = models.IntegerField(choices=status,verbose_name='状态')
classes = models.ForeignKey('Classes',on_delete=models.CASCADE,related_name='course',verbose_name='课程')
level = models.ForeignKey('Level',on_delete=models.CASCADE,related_name='grade',verbose_name='难度级别')
wright = models.IntegerField(unique=True,verbose_name='权重')
title = models.CharField(max_length=20,verbose_name='标题')
intro = models.CharField(max_length=32,verbose_name='简介')
href = models.CharField(max_length=50,verbose_name='视频地址')
class Meta:
db_table = 'video'
verbose_name_plural = '视频教程'
def __str__(self):
return self.title
views:
def video(request,*args,**kwargs):#添加关键字匹配
container = {} #创建一个空字典用于给视频字段搜索
for k,v in kwargs.items(): #把kwargs传过来的关键字参数的值转换为int类型
temp = int(v)
kwargs[k] = temp
direction_id = kwargs.get('direction_id') #拿到关键字参数
classes_id = kwargs.get('classes_id')
level_id = kwargs.get('level_id')
direction_list = models.Direction.objects.all() #方向字段
if direction_id == 0: #如果方向为0,列出全部课程
class_list = models.Classes.objects.all()
if classes_id == 0: #如果课程为0,不做任何操作,如果课程不为0把课程ID添加到container字典中
pass
else:
container['classes_id'] = classes_id
if level_id == 0: #如果难度级别为0,不做任何操作,如果不为0把难度级别ID添加到container字典中
pass
else:
container['level_id'] = level_id
else:
direction_obj = models.Direction.objects.filter(id=direction_id).first() #如果方向不为0,根据关键字传过来的ID参数筛选方向对象
class_list = direction_obj.classes.all() #列出方向对象对应的所有课程
v_list = direction_obj.classes.all().values_list('id') #生成方向对象对应的所有课程的ID列表
if not v_list: #如果没有匹配到课程ID列表把列表设置为空
classes_id_list = []
else:
classes_id_list = list(zip(*v_list))[0] #如果匹配到了通过ZIP函数生成课程ID列表
if classes_id not in classes_id_list:
kwargs['classes_id'] = 0
classes_id = 0
else:
container['classes_id'] = classes_id
if classes_id == 0: #如果课程ID为0 用双下划线In方法匹配这个方向下所有的课程ID
container['classes_id__in'] = classes_id_list
else: #如果不为0 课程ID赋值给容器字典
container['classes_id'] = classes_id
if level_id == 0:
pass
else:
container['level_id'] = level_id
level_list = models.Level.objects.all()
video_list = models.Video.objects.filter(**container) #通过关键字解包匹配视频字段
return render(request,'video.html',locals())
HTML:
<div>
<h1>筛选</h1>
<div>
{% if kwargs.direction_id == 0 %}
<a class="actives" href="/video-0-{{ kwargs.classes_id }}-{{ kwargs.level_id }}.html">全部</a>
{% else %}
<a href="/video-0-{{ kwargs.classes_id }}-{{ kwargs.level_id }}.html">全部</a>
{% endif %}
{% for item in direction_list %}
{% if item.id == kwargs.direction_id %}
<a class="actives" href="/video-{{ item.id }}-{{ kwargs.classes_id }}-{{ kwargs.level_id }}.html">{{ item.name }}</a>
{% else %}
<a href="/video-{{ item.id }}-{{ kwargs.classes_id }}-{{ kwargs.level_id }}.html">{{ item.name }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if kwargs.classes_id == 0 %}
<a class="actives" href="/video-{{ kwargs.direction_id }}-0-{{ kwargs.level_id }}.html">全部</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-0-{{ kwargs.level_id }}.html">全部</a>
{% endif %}
{% for item in class_list %}
{% if item.id == kwargs.classes_id %}
<a class="actives" href="/video-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}.html">{{ item.name }}</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}.html">{{ item.name }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if kwargs.level_id == 0 %}
<a class="actives" href="/video-{{ kwargs.direction_id }}-{{ kwargs.classes_id }}-0.html">全部</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classes_id }}-0.html">全部</a>
{% endif %}
{% for item in level_list %}
{% if item.id == kwargs.level_id %}
<a class="actives" href="/video-{{ kwargs.direction_id }}-{{ kwargs.classes_id }}-{{ item.id }}.html">{{ item.title}}</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classes_id }}-{{ item.id }}.html">{{ item.title}}</a>
{% endif %}
{% endfor %}
</div>
</div>
<div>
<h1>结果</h1>
<div>
{% for item in video_list %}
<p>{{ item.title }}</p>
{% endfor %}
</div>
</div>