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


Posted in Python onAugust 06, 2019

一.简介

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

有4张表:

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

它们的关系是:

Direction与Classification多对多关系

Video与Classification,Level是一对多关系

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

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

二.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<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+))
  # 构造查询字典
  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,
    }
  )

五.模板代码

<!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>结果</h1>
  {% for row in video_list %}
    <div>{{ row.title }}</div>
  {% endfor %}
</div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python3实现UDP协议的服务器和客户端
Jun 14 Python
浅谈python内置变量-reversed(seq)
Jun 21 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
Python中property函数用法实例分析
Jun 04 Python
Python实战之制作天气查询软件
May 14 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 Python
Django自带的加密算法及加密模块详解
Dec 03 Python
python和php学习哪个更有发展
Jun 17 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 Python
Python连接mysql方法及常用参数
Sep 01 Python
深入理解python协程
Jun 15 Python
使用Python自动生成HTML的方法示例
Aug 06 #Python
Django RBAC权限管理设计过程详解
Aug 06 #Python
python虚拟环境完美部署教程
Aug 06 #Python
python批量图片处理简单示例
Aug 06 #Python
Python实用库 PrettyTable 学习笔记
Aug 06 #Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 #Python
Python中调用其他程序的方式详解
Aug 06 #Python
You might like
php多功能图片处理类分享(php图片缩放类)
2014/03/14 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
点击广告后才能获得下载地址
2006/10/26 Javascript
javascript数组使用调用方法汇总
2007/12/08 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
Python实现爬取并分析电商评论
2020/06/19 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
德国童装购物网站:NICKI´S.com
2018/04/20 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
华三通信H3C面试题
2015/05/15 面试题
暑期实践思想汇报
2014/01/06 职场文书
品牌服务方案
2014/06/03 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
党员示范岗材料
2014/12/19 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
初中数学教学随笔
2015/08/15 职场文书
如何拟写通知正文?
2019/04/02 职场文书
各国货币符号大全
2022/02/17 杂记
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python