栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

django组合搜索实现过程详解(附代码)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

django组合搜索实现过程详解(附代码)

一.简介
  • # 组合搜索
  • # 技术方向:自动化,测试,运维,前端
  • # 分类:Python Linux Javascript OpenStack Node.js GO
  • # 级别:初级 中级 高级 骨灰级

有4张表:

Direction(技术方向标),Classification(技术分类表),Level(难度级别表),Video(视频表)

它们的关系是:

Direction与Classification多对多关系

Video与Classification,Level是一对多关系

最终要实现的结果如下图:

二.models代码
class Direction(models.Model):
  """
  技术方向:自动化,测试,运维,前端
  """
  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='状态', choices=status_choice, default=1)
  level = models.ForeignKey(Level)
  classification = models.ForeignKey('Classification', null=True, blank=True)
  weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)
  title = models.CharField(verbose_name='标题', 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(d+))-(?P(d+))-(?P(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(d+))-(?P(d+))-(?P(d+))
  # 构造查询字典
  direction_id = kwargs.get('direction_id')
  classification_id = kwargs.get('classification_id')
  level_id = kwargs.get('level_id')
  # 获取所有的技术方向
  direction_list = models.Direction.objects.all()
  # 当没有选择技术方向时,就获取所有分类
  if direction_id == 0:
    class_list = models.Classification.objects.all()
    # 当没有选择分类时,不做什么
    if classification_id == 0:
      pass
    else:
      # 否则就将分类id放入字典
      condition['classification_id'] = classification_id
  else:
    # 当选择了技术方向id时,查询出该技术方向下的所有分类
    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转换成列表
      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:
 #指定技术方向:[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)
  # 技术方向的queryset对象列表
  print(direction_list)
  # 分类的queryset对象列表
  print(class_list)
  # 等级的queryset对象列表
  print(level_list)
  # video的queryset对象列表
  print(video_list)
  # 技术方向的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,
    }
  )
五.模板代码



  
  Title
  
    .condition a {
      display: inline-block;
      padding: 5px 8px;
      border: 1px solid #dddddd;
    }
    .condition a.active {
      background-color: coral;
      color: white;
    }
  



  筛选
  
    {% if kwargs.direction_id == 0 %}
      {#反向解析#}
      全部
    {% else %}
      全部
    {% endif %}
    {% for item in direction_list %}
      {% if item.id == kwargs.direction_id %}
 {{ item.name }}
      {% else %}
 {{ item.name }}
      {% endif %}
    {% endfor %}
  
  
    {% if kwargs.classification_id == 0 %}
      全部
    {% else %}
      全部
    {% endif %}
    {% for item in class_list %}
      {% if item.id == kwargs.classification_id %}
 {{ item.name }}
      {% else %}
 {{ item.name }}
      {% endif %}
    {% endfor %}
  
  
    {% if kwargs.level_id == 0 %}
      全部
    {% else %}
      全部
    {% endif %}
    {% for item in level_list %}
      {% if item.id == kwargs.level_id %}
 {{ item.title }}
      {% else %}
 {{ item.title }}
      {% endif %}
    {% endfor %}
  


  结果
  {% for row in video_list %}
    {{ row.title }}
  {% endfor %}


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/24729.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号