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 相关文章推荐
Python抓取框架 Scrapy的架构
Aug 12 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
利用matplotlib+numpy绘制多种绘图的方法实例
May 03 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
Python模块、包(Package)概念与用法分析
May 31 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
python 设置输出图像的像素大小方法
Jul 04 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
Python Django项目和应用的创建详解
Nov 27 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数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
Python中正则表达式的用法实例汇总
2014/08/18 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
Python操作csv文件实例详解
2017/07/31 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
详解python和matlab的优势与区别
2019/06/28 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
python实现扫雷游戏
2020/03/03 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
招商经理岗位职责
2013/11/16 职场文书
教师个人的自我评价分享
2014/01/02 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
外贸专业求职信
2014/03/09 职场文书
优秀教师申报材料
2014/12/16 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
党员反邪教心得体会
2016/01/15 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫