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中的相对导入和绝对导入
Jan 06 Python
Python实现返回数组中第i小元素的方法示例
Dec 04 Python
pandas求两个表格不相交的集合方法
Dec 08 Python
详解python解压压缩包的五种方法
Jul 05 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
基于FME使用Python过程图解
May 13 Python
使用python对excel表格处理的一些小功能
Jan 25 Python
Django视图类型总结
Feb 17 Python
python反编译教程之2048小游戏实例
Mar 03 Python
实操Python爬取觅知网素材图片示例
Nov 27 Python
如何利用python创作字符画
Jun 25 Python
python缺失值填充方法示例代码
Dec 24 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 MemCached 高级缓存应用代码
2010/08/05 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
动态加载script文件的两种方法
2013/08/15 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
值得收藏的10道python 面试题
2019/04/15 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
python可视化实现KNN算法
2019/10/16 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
清华大学自主招生自荐信
2014/01/29 职场文书
工作求职信
2014/07/04 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
Python合并多张图片成PDF
2021/06/09 Python