欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django組合搜索實現(xiàn)過程詳解(附代碼)

 更新時間:2019年08月06日 14:31:50   作者:Maple_feng  
這篇文章主要介紹了django組合搜索實現(xiàn)過程詳解(附代碼),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

一.簡介

  • # 組合搜索
  • # 技術(shù)方向:自動化,測試,運維,前端
  • # 分類:Python Linux JavaScript OpenStack Node.js GO
  • # 級別:初級 中級 高級 骨灰級

有4張表:

Direction(技術(shù)方向標(biāo)),Classification(技術(shù)分類表),Level(難度級別表),Video(視頻表)

它們的關(guān)系是:

Direction與Classification多對多關(guān)系

Video與Classification,Level是一對多關(guān)系

最終要實現(xiàn)的結(jié)果如下圖:

二.models代碼

class Direction(models.Model):
  """
  技術(shù)方向:自動化,測試,運維,前端
  """
  name = models.CharField(verbose_name='名稱', max_length=32)
  classification = models.ManyToManyField('Classification')

  class Meta:
    # 重命名表名,不要自動添加的app名
    db_table = 'Direction'
    verbose_name_plural = '方向(視頻方向)'
  def __str__(self):
    return self.name
class Classification(models.Model):
  """
  分類:Python Linux JavaScript OpenStack Node.js GO
  """
  name = models.CharField(verbose_name='名稱', max_length=32)
  class Meta:
    db_table = 'Classification'
    verbose_name_plural = '分類(視頻分類)'

  def __str__(self):
    return self.name
class Level(models.Model):
  title = models.CharField(max_length=32)

  class Meta:
    db_table = 'Level'
    verbose_name_plural = '難度級別'

  def __str__(self):
    return self.title
class Video(models.Model):
  status_choice = (
    (1, '下線'),
    (2, '上線'),
  )
  status = models.IntegerField(verbose_name='狀態(tài)', choices=status_choice, default=1)
  level = models.ForeignKey(Level)
  classification = models.ForeignKey('Classification', null=True, blank=True)
  weight = models.IntegerField(verbose_name='權(quán)重(按從大到小排列)', default=0)
  title = models.CharField(verbose_name='標(biāo)題', max_length=32)
  summary = models.CharField(verbose_name='簡介', max_length=32)
  # img = models.ImageField(verbose_name='圖片', upload_to='./static/images/Video/')
  img = models.CharField(verbose_name='圖片', max_length=32)
  href = models.CharField(verbose_name='視頻地址', max_length=256)
  create_date = models.DateTimeField(auto_now_add=True)
  class Meta:
    db_table = 'Video'
    verbose_name_plural = '視頻'
  def __str__(self):
    return self.title

三.url路由代碼

urlpatterns=[
  url(r'^admin',admin.site.urls),
  #利用的是有名分組的方法,分別獲取不同的id
  url(r'^video-(?P<direction_id>(\d+))-(?P<classification_id>(\d+))-(?P<level_id>(\d+)).html$', views.video,
    name='video')
]

四.視圖代碼

def video(request,*args,**kwargs):
  condition = {}
  for k, v in kwargs.items():
    temp = int(v)
    kwargs[k] = temp
  print(kwargs) # (?P<direction_id>(\d+))-(?P<classification_id>(\d+))-(?P<level_id>(\d+))
  # 構(gòu)造查詢字典
  direction_id = kwargs.get('direction_id')
  classification_id = kwargs.get('classification_id')
  level_id = kwargs.get('level_id')
  # 獲取所有的技術(shù)方向
  direction_list = models.Direction.objects.all()
  # 當(dāng)沒有選擇技術(shù)方向時,就獲取所有分類
  if direction_id == 0:
    class_list = models.Classification.objects.all()
    # 當(dāng)沒有選擇分類時,不做什么
    if classification_id == 0:
      pass
    else:
      # 否則就將分類id放入字典
      condition['classification_id'] = classification_id
  else:
    # 當(dāng)選擇了技術(shù)方向id時,查詢出該技術(shù)方向下的所有分類
    direction_obj = models.Direction.objects.filter(id=direction_id).first()
    class_list = direction_obj.classification.all()
    # 只獲取該方向下的分類id
    vlist = direction_obj.classification.all().values_list('id')
    # 下面的代碼為了生成condition是傳入的一對多查詢id,如:{'classification_id__in': (1, 2, 3), 'level_id': 1}
    if not vlist:
      classification_id_list = []
    else:
      # 將vlist轉(zhuǎn)換成列表
      classification_id_list = list(zip(*vlist))[0]
    if classification_id == 0:
      condition['classification_id__in'] = classification_id_list
    else:
      if classification_id in classification_id_list:
        condition['classification_id'] = classification_id
      else:
        #指定技術(shù)方向:[1,2,3]  分類:5
        kwargs['classification_id'] = 0
        condition['classification_id__in'] = classification_id_list

  if level_id == 0:
    pass
  else:
    condition['level_id'] = level_id
  level_list = models.Level.objects.all()
  video_list = models.Video.objects.filter(**condition)
  # 技術(shù)方向的queryset對象列表
  print(direction_list)
  # 分類的queryset對象列表
  print(class_list)
  # 等級的queryset對象列表
  print(level_list)
  # video的queryset對象列表
  print(video_list)
  # 技術(shù)方向的id,分類的id,等級的id組成的字典
  print(kwargs)
  return render(
    request,
    'video.html',
    {
      'direction_list':direction_list,
      'class_list':class_list,
      'level_list':level_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: coral;
      color: white;
    }
  </style>
</head>
<body>
<div class="condition">
  <h1>篩選</h1>
  <div>
    {% if kwargs.direction_id == 0 %}
      {#反向解析#}
      <a href="{% url " rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" video" direction_id=0 classification_id=kwargs.classification_id level_id=kwargs.level_id %}"
        class="active">全部</a>
    {% else %}
      <a href="{% url " rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" video" direction_id=0 classification_id=kwargs.classification_id level_id=kwargs.level_id %}">全部</a>
    {% endif %}
    {% for item in direction_list %}
      {% if item.id == kwargs.direction_id %}
        <a href="{% url " rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" video" direction_id=item.id classification_id=kwargs.classification_id level_id=kwargs.level_id %}"
          class="active">{{ item.name }}</a>
      {% else %}
        <a href="{% url " rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" video" direction_id=item.id classification_id=kwargs.classification_id level_id=kwargs.level_id %}">{{ item.name }}</a>
      {% endif %}
    {% endfor %}
  </div>
  <div>
    {% if kwargs.classification_id == 0 %}
      <a href="/video-{{ kwargs.direction_id }}-0-{{ kwargs.level_id }}.html" rel="external nofollow" rel="external nofollow" class="active">全部</a>
    {% else %}
      <a href="/video-{{ kwargs.direction_id }}-0-{{ kwargs.level_id }}.html" rel="external nofollow" rel="external nofollow" >全部</a>
    {% endif %}
    {% for item in class_list %}
      {% if item.id == kwargs.classification_id %}
        <a href="/video-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}.html" rel="external nofollow" rel="external nofollow" 
          class="active">{{ item.name }}</a>
      {% else %}
        <a href="/video-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}.html" rel="external nofollow" rel="external nofollow" >{{ item.name }}</a>
      {% endif %}
    {% endfor %}
  </div>
  <div>
    {% if kwargs.level_id == 0 %}
      <a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-0.html" rel="external nofollow" rel="external nofollow" class="active">全部</a>
    {% else %}
      <a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-0.html" rel="external nofollow" rel="external nofollow" >全部</a>
    {% endif %}
    {% for item in level_list %}
      {% if item.id == kwargs.level_id %}
        <a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-{{ item.id }}.html" rel="external nofollow" rel="external nofollow" 
          class="active">{{ item.title }}</a>
      {% else %}
        <a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-{{ item.id }}.html" rel="external nofollow" rel="external nofollow" >{{ item.title }}</a>
      {% endif %}
    {% endfor %}
  </div>
</div>
<div>
  <h1>結(jié)果</h1>
  {% for row in video_list %}
    <div>{{ row.title }}</div>
  {% endfor %}
</div>
</body>
</html>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Python生成跑馬燈視頻的完整代碼

    使用Python生成跑馬燈視頻的完整代碼

    這篇文章主要介紹了如何使用Python生成跑馬燈視頻,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-11-11
  • pytorch中的named_parameters()和parameters()

    pytorch中的named_parameters()和parameters()

    這篇文章主要介紹了pytorch中的named_parameters()和parameters()使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python中的錯誤和異常處理簡單操作示例【try-except用法】

    Python中的錯誤和異常處理簡單操作示例【try-except用法】

    這篇文章主要介紹了Python中的錯誤和異常處理簡單操作,結(jié)合實例形式分析了Python中try except在錯誤與異常處理中的用法,需要的朋友可以參考下
    2017-07-07
  • 基于python分享一款地理數(shù)據(jù)可視化神器keplergl

    基于python分享一款地理數(shù)據(jù)可視化神器keplergl

    這篇文章主要介紹了分享一款地理數(shù)據(jù)可視化神器keplergl,keplergl是由Uber開源的一款地理數(shù)據(jù)可視化工具,通過keplergl我們可以在Jupyter?notebook中使用,下文分享需要的小伙伴可以參考一下
    2022-02-02
  • python接口調(diào)用已訓(xùn)練好的caffe模型測試分類方法

    python接口調(diào)用已訓(xùn)練好的caffe模型測試分類方法

    今天小編就為大家分享一篇python接口調(diào)用已訓(xùn)練好的caffe模型測試分類方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python?Decorator裝飾器的創(chuàng)建方法及常用場景分析

    Python?Decorator裝飾器的創(chuàng)建方法及常用場景分析

    這篇文章主要介紹了Python?Decorator裝飾器的創(chuàng)建方法及常用場景,裝飾器可以分成方法裝飾器和類裝飾器,他們的區(qū)別是一個是用函數(shù)實現(xiàn)的裝飾器,一個是用類實現(xiàn)的裝飾器,他們也都能在方法和類上進行裝飾,需要的朋友可以參考下
    2022-07-07
  • windows+vscode安裝paddleOCR運行環(huán)境的步驟

    windows+vscode安裝paddleOCR運行環(huán)境的步驟

    這篇文章主要介紹了windows+vscode安裝paddleOCR運行環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Django 生成登陸驗證碼代碼分享

    Django 生成登陸驗證碼代碼分享

    這篇文章主要介紹了Django 生成登陸驗證碼代碼分享,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • python語法 range() 序列類型range

    python語法 range() 序列類型range

    這篇文章主要介紹了python語法 range() 序列類型range,range是一種序列類型,range類型用于表示不可變的整數(shù)序列,下面小編整理了簡單內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • 利用python代碼寫的12306訂票代碼

    利用python代碼寫的12306訂票代碼

    這篇文章主要介紹了利用python代碼寫的12306訂票代碼,自己寫的python代碼,是非常實用的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-12-12

最新評論