亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

Django 標簽篩選的實現代碼(一對多、多對多)

2024-05-05 00:05:15
字體:
來源:轉載
供稿:網友

實現的目標(一對多)

實現針對課程實現:課程類型、難度級別、是否隱藏三個方式的篩選

每一個視頻文件有針對一個課程類型、一個難度級別、是否隱藏

設計數據庫如下:

# 視頻分類表格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, } )

前臺展示文件:

<!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 class="condition"> <h1>篩選</h1> <div>  {% if kwargs.Video_type_id == 0%}  <a href="/video-0-{{ kwargs.Video_dif_id }}-{{ kwargs.display }}" rel="external nofollow" rel="external nofollow" class="active">全部</a>  {% else %}  <a href="/video-0-{{ kwargs.Video_dif_id }}-{{ kwargs.display }}" rel="external nofollow" rel="external nofollow" >全部</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 }}" rel="external nofollow" rel="external nofollow" class="active">{{ i.Video_Type }}</a>  {% else %}   <a href="/video-{{ i.id }}-{{ kwargs.Video_dif_id }}-{{ kwargs.display }}" rel="external nofollow" rel="external nofollow" >{{ i.Video_Type }}</a>  {% endif %}  {% endfor %} </div> <div>  {% if kwargs.Video_dif_id == 0%}  <a href="/video-{{ kwargs.Video_type_id }}-0-{{ kwargs.display }}" rel="external nofollow" rel="external nofollow" class="active">全部</a>  {% else %}  <a href="/video-{{ kwargs.Video_type_id }}-0-{{ kwargs.display }}" rel="external nofollow" rel="external nofollow" >全部</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 }}" rel="external nofollow" rel="external nofollow" class="active">{{ i.Video_dif }}</a>  {% else %}   <a href="/video-{{ kwargs.Video_type_id }}-{{ i.id }}-{{ kwargs.display }}" rel="external nofollow" rel="external nofollow" >{{ i.Video_dif }}</a>  {% endif %}  {% endfor %} </div> <div>  {% if kwargs.display == 0 %}  <a class="active" href="/video-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}-0" rel="external nofollow" rel="external nofollow" >全部</a>  {% else %}  <a href="/video-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}-0" rel="external nofollow" rel="external nofollow" >全部</a>  {% endif %}  {% for item in display_list %}  {% if item.id == kwargs.display %}   <a class="active" href="/video-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}-{{ item.id }}" rel="external nofollow" rel="external nofollow" >{{ item.name }}</a>  {% else %}   <a href="/video-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}-{{ item.id }}" rel="external nofollow" rel="external nofollow" >{{ 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標簽中的數字控制后臺篩選操作

實現的目標(多對多)

實現針對課程實現:課程方向、課程類型、難度級別三個方式的篩選

其中每個課程方向中包含有多個課程類型,選擇課程方向后,篩選課程方向包含的所有課程類型

每一個視頻文件有針對一個課程類型、一個難度級別

設計數據庫如下,在一對多的基礎上增加了一個多對多的課程方向表:

# 方向分類:ID、名稱(與視頻—分類做多對多關系)class VideoGroup(models.Model): Video_group = models.CharField(max_length=50) group_type = models.ManyToManyField('VideoType') class Meta: verbose_name_plural = '方向分類' def __str__(self): return self.Video_group# 視頻分類表格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文件:

urlpatterns = [ path('admin/', admin.site.urls), path('video2/', views.video2), re_path('video2-(?P<Video_group_id>(/d+))-(?P<Video_type_id>(/d+))-(?P<Video_dif_id>(/d+))', views.video2),]

后臺程序文件:

def video2(request, *args, **kwargs): condition = {} # 思路 -- 構造查詢字典 """ 如果:獲取Video_group_id=0 代表方向是全部,不會對以后的篩選造成影響 *列出所有的type 如果:Video_type_id=0  pass 否則:  condition【'Video_type_id'】= Video_type_id 否則:*列出當前方向下的type 如果:Video_type_id=0  獲取當前方向下的type的所有的id【1,2,3,4】  condition【'Video_type_id__in'】= 【1,2,3,4】 否則:  需要查看當前的type是否在當前的方向列表中,如果在:  condition【'Video_type_id'】= Video_type_id  如果不在:  condition【'Video_type_id__in'】= 【1,2,3,4】 """ if not kwargs: kwargs = {  'Video_type_id':0,  'Video_dif_id':0,  'Video_group_id':0, } for k, v in kwargs.items(): temp = int(v) kwargs[k] = temp # 首先從kwargs中取出相應的id group_id = kwargs.get('Video_group_id') type_id = kwargs.get('Video_type_id') dif_id = kwargs.get('Video_dif_id') # 從數據庫中取出所有的group列表,因為所有方向在頁面上都要顯示 group_list = models.VideoGroup.objects.all() # 判斷group值是否為0 if group_id == 0: # 如果為0,則列出所有type的列表 VideoType_list = models.VideoType.objects.all() # 如果type的列表也為0,篩選中就不用作特殊操作 if type_id == 0:  pass # 如果type的列表不為0,篩選列表中增加type的id else:  condition['Video_type_id'] = type_id # 如果group值不為0 else: # 首先根據group的id篩選出分類表格中的內容,形成一個對象 group_obj = models.VideoGroup.objects.filter(id=group_id).first() # 再根據group篩選出的對象,用多對多表格字段,篩選出所有的type的列表,等待返回給前臺使用 VideoType_list = group_obj.group_type.all() # 獲取篩選后的type的id值,得到一個QuerySet [(1,),(3,),(4,)]的對象 vlist = group_obj.group_type.all().values_list('id') # 如果篩選后的type的值為空,也就是沒有找到對應的type類型 if not vlist:  # 設置一個空列表  type_ids = [] # 如果篩選后的type值有內容 else:  # 將vlist進行一個zip,獲得一個zip的對象,再轉化為列表,得到一個【(1,3,4)】,取第一個值,得到(1,3,4)  type_ids = list(zip(*vlist))[0] # (1,3,4) # 判斷如果前臺傳來的type為0的話 if type_id == 0:  # 后臺篩選的時候,查詢按照方向篩選出來的type_ids進行查詢  # __in指的是用列表方式查詢多個id  condition['Video_type_id__in'] = type_ids # 如果前臺傳來的type不為0的時候,有兩種情況 else:  # 如果前臺傳來的type值在后臺篩選的值范圍內的時候  if type_id in type_ids:  # 后臺篩選的typeid就按照前臺傳來的type值篩選,也就是前臺選了某個課程,如果課程方向發生改變的時候,課程類型還在選擇范圍內,前臺也仍然是選中的狀態,我們也就仍然返回選中的課程類型篩選的內容  condition['Video_type_id'] = type_id  # 如果前臺傳來的type值不在后臺篩選的值范圍內的時候  else:  # 就按照后臺篩選的課程方向向下的所有type類型進行篩選  condition['Video_type_id__in'] = type_ids  kwargs['Video_type_id'] = 0 # 難度這邊跟上面的多對多沒有關聯,與一對多的情況時一樣 if dif_id == 0: pass else: condition['Video_dif_id'] = dif_id VideoDif_list = models.VideoDif.objects.all() # 最終將符合條件的視頻篩選出來 video_list = models.Video.objects.filter(**condition) return render( request, 'video2.html', {  'group_list': group_list,  'VideoType_list': VideoType_list,  'VideoDif_list': VideoDif_list,  'video_list': video_list,  'kwargs': kwargs } )

前臺展示文件:

<!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 class="condition"> <h1>篩選</h1> <div>  {% if kwargs.Video_group_id == 0%}  <a href="/video2-0-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}" rel="external nofollow" rel="external nofollow" class="active">全部</a>  {% else %}  <a href="/video2-0-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}" rel="external nofollow" rel="external nofollow" >全部</a>  {% endif %}  {% for item in group_list %}  {% if item.id == kwargs.Video_group_id %}   <a class="active" href="/video2-{{ item.id }}-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}" rel="external nofollow" rel="external nofollow" >{{ item.Video_group }}</a>  {% else %}   <a href="/video2-{{ item.id }}-{{ kwargs.Video_type_id }}-{{ kwargs.Video_dif_id }}" rel="external nofollow" rel="external nofollow" >{{ item.Video_group }}</a>  {% endif %}  {% endfor %} </div> <div>  {% if kwargs.Video_type_id == 0%}  <a href="/video2-{{ kwargs.Video_group_id }}-0-{{ kwargs.Video_dif_id }}" rel="external nofollow" rel="external nofollow" class="active">全部</a>  {% else %}  <a href="/video2-{{ kwargs.Video_group_id }}-0-{{ kwargs.Video_dif_id }}" rel="external nofollow" rel="external nofollow" >全部</a>  {% endif %}  {% for item in VideoType_list %}  {% if item.id == kwargs.Video_type_id %}   <a class="active" href="/video2-{{ kwargs.Video_group_id }}-{{ item.id }}-{{ kwargs.Video_dif_id }}" rel="external nofollow" rel="external nofollow" >{{ item.Video_Type }}</a>  {% else %}   <a href="/video2-{{ kwargs.Video_group_id }}-{{ item.id }}-{{ kwargs.Video_dif_id }}" rel="external nofollow" rel="external nofollow" >{{ item.Video_Type }}</a>  {% endif %}  {% endfor %} </div> <div>  {% if kwargs.Video_dif_id == 0%}  <a href="/video2-{{ kwargs.Video_group_id }}-{{ kwargs.Video_type_id }}-0" rel="external nofollow" rel="external nofollow" class="active">全部</a>  {% else %}  <a href="/video2-{{ kwargs.Video_group_id }}-{{ kwargs.Video_type_id }}-0" rel="external nofollow" rel="external nofollow" >全部</a>  {% endif %}  {% for item in VideoDif_list %}  {% if item.id == kwargs.Video_dif_id %}   <a class="active" href="/video2-{{ kwargs.Video_group_id }}-{{ kwargs.Video_type_id }}-{{ item.id }}" rel="external nofollow" rel="external nofollow" >{{ item.Video_dif }}</a>  {% else %}   <a href="/video2-{{ kwargs.Video_group_id }}-{{ kwargs.Video_type_id }}-{{ item.id }}" rel="external nofollow" rel="external nofollow" >{{ item.Video_dif }}</a>  {% endif %}  {% endfor %} </div> </div> <div> <h1>結果</h1> <div>  {% for item in video_list %}  <p>{{ item.Video_title }}</p>  {% endfor %} </div> </div></body></html>

總結

以上所述是小編給大家介紹的Django 標簽篩選的實現代碼(一對多、多對多),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线一区二区视频| 亚洲精品美女网站| 色香阁99久久精品久久久| 久久久久久久久久久久久久久久久久av| 国产精品精品国产| 68精品国产免费久久久久久婷婷| 一区二区三区www| 亚洲**2019国产| 欧美日韩一区二区免费视频| 成人黄色在线观看| 国产成人精品在线视频| 国产午夜一区二区| 一区二区三区四区精品| 欧美国产亚洲视频| 久久久国产精彩视频美女艺术照福利| 91牛牛免费视频| 8x拔播拔播x8国产精品| 日韩欧美国产网站| 亚洲情综合五月天| 亚洲欧美日韩精品久久亚洲区| 亚洲成人激情在线| 久久久久久伊人| 最近日韩中文字幕中文| 国产精品国模在线| 色yeye香蕉凹凸一区二区av| 亚洲国产精品va在线观看黑人| 国产亚洲精品久久久| 日韩欧美在线免费| 曰本色欧美视频在线| 韩国视频理论视频久久| 综合国产在线视频| 欧美体内谢she精2性欧美| 欧美日韩成人黄色| 欧美性xxxx极品hd欧美风情| 亚洲一区二区中文| 九九热最新视频//这里只有精品| 亚洲第一福利在线观看| 亚洲综合在线小说| 欧美一区深夜视频| 午夜精品一区二区三区在线视频| 亚洲护士老师的毛茸茸最新章节| 精品久久久久久久大神国产| 亚洲老板91色精品久久| 777精品视频| 精品一区二区三区四区| 亚洲精品成人免费| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美精品在线第一页| 国产精品久久久一区| 成人精品aaaa网站| 91av网站在线播放| 国产在线播放不卡| 奇门遁甲1982国语版免费观看高清| www欧美日韩| 国产一区二区动漫| 欧美裸体xxxx极品少妇软件| 欧美日韩国产精品专区| 亚洲国语精品自产拍在线观看| 国产精品一区二区三区成人| 欧美电影《睫毛膏》| 日本久久91av| 欧美在线一级视频| 亚洲а∨天堂久久精品9966| 亚洲欧美日韩另类| 久久久久久999| 一级做a爰片久久毛片美女图片| 情事1991在线| 日韩欧美在线网址| 亚洲成年人影院在线| 九九精品视频在线观看| 日韩免费av一区二区| 亚洲国产精品电影在线观看| 国产视频久久网| 97久久精品国产| 欧美性极品xxxx做受| 国产精品视频一区二区高潮| 亚洲亚裔videos黑人hd| 亚洲综合色av| 日韩在线观看免费高清完整版| 国产亚洲精品激情久久| 亚洲黄页网在线观看| 日韩欧美主播在线| 亚洲电影在线观看| 亚洲成人av在线播放| 亚洲午夜未删减在线观看| 久久天天躁日日躁| 中文字幕亚洲欧美在线| 久久久久久久999精品视频| 久久亚洲欧美日韩精品专区| 国产成人激情视频| 一区二区三区黄色| 亚洲精品自产拍| 亚洲视频在线观看免费| 国产成人一区二区三区电影| 色偷偷av一区二区三区乱| 韩国国内大量揄拍精品视频| 国产69精品久久久久99| 欧美中文在线观看| 欧美午夜激情视频| 国产精品美腿一区在线看| 欧美亚洲另类视频| 亚洲午夜国产成人av电影男同| 国产女精品视频网站免费| 91天堂在线观看| 国产成人综合一区二区三区| 日本韩国欧美精品大片卡二| 国产精品电影久久久久电影网| 日日骚久久av| 成人免费大片黄在线播放| 国产日韩专区在线| 国产va免费精品高清在线| 欧美老女人在线视频| 国产精品中文在线| 中文字幕av一区| 日av在线播放中文不卡| 日韩激情视频在线| 毛片精品免费在线观看| 亚洲国产日韩欧美在线99| 欧美在线视频一二三| 欧美视频在线看| 国产精品久久久久久久9999| 国产精品视频专区| 日韩精品在线观看视频| 8090成年在线看片午夜| 深夜福利国产精品| 国产精品日韩在线播放| 久久免费国产精品1| 国内精品视频久久| 国产精品女人网站| 97视频免费看| 久久久久久久影院| 成人在线视频福利| 日韩电视剧免费观看网站| 九九热最新视频//这里只有精品| 亚洲国产成人91精品| 国产精品99久久久久久www| 国产综合久久久久久| 一本色道久久综合狠狠躁篇的优点| 色先锋久久影院av| 欧美成人午夜激情在线| 韩日欧美一区二区| 国产精品久久久久av| 中文字幕亚洲无线码在线一区| 久久久精品中文字幕| 国产在线a不卡| 亚洲aⅴ日韩av电影在线观看| 韩国美女主播一区| 欧美视频裸体精品| xxxxx成人.com| 在线观看日韩专区| 日韩人体视频一二区| 欧美激情小视频| 久久99久久99精品免观看粉嫩| 91精品国产91久久久| 国产精品久久久久久久久久小说| 日韩欧美大尺度| 日韩国产精品亚洲а∨天堂免| 亚洲一区二区中文字幕| 亚洲视频电影图片偷拍一区| 亚洲伊人一本大道中文字幕| 国产午夜精品全部视频播放| 久久久精品2019中文字幕神马| 欧美日韩亚洲国产一区| 97精品欧美一区二区三区|