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<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 "video" direction_id=0 classification_id=kwargs.classification_id level_id=kwargs.level_id %}"
class="active">全部</a>
{% else %}
<a href="{% url "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 "video" direction_id=item.id classification_id=kwargs.classification_id level_id=kwargs.level_id %}"
class="active">{{ item.name }}</a>
{% else %}
<a href="{% url "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" class="active">全部</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-0-{{ kwargs.level_id }}.html">全部</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"
class="active">{{ item.name }}</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-{{ item.id }}-{{ kwargs.level_id }}.html">{{ item.name }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if kwargs.level_id == 0 %}
<a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-0.html" class="active">全部</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-0.html">全部</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"
class="active">{{ item.title }}</a>
{% else %}
<a href="/video-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-{{ item.id }}.html">{{ item.title }}</a>
{% endif %}
{% endfor %}
</div> </div>
<div>
<h1>结果</h1>
{% for row in video_list %}
<div>{{ row.title }}</div>
{% endfor %}
</div>
</body>
</html>
django中实现组合搜索的更多相关文章
- Python开发【Django】:组合搜索、JSONP、XSS过滤
组合搜索 做博客后台时,需要根据文章的类型做不同的检索 1.简单实现 关联文件: from django.conf.urls import url from . import views urlpat ...
- Django中组合搜索功能
需求分析 很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,看个例子吧: 注意红框中的标识,我们可以根据URL来做组合搜索. video- ...
- Django实现组合搜索
一.实现方法 1.纯模板语言实现 2.自定义simpletag实现(本质是简化了纯模板语言的判断) 二.基本原理 原理都是通过django路由系统,匹配url筛选条件,将筛选条件作为数据库查询结果,返 ...
- Django实现瀑布流,组合搜索
Django中组合搜索功能 需求分析 很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,看个例子吧: 注意红框中的标识,我们可以根据URL ...
- django实现瀑布流、组合搜索、阶梯评论、验证码
django实现图片瀑布流布局 我们在一些图片网站上经常会看到,满屏都是图片,而且图片都大小不一,却可以按空间排列.默认一个div是占用一行,当想把div里的图片并排显示的时候,只能使用float属性 ...
- Django学习---组合搜索组件
组合搜索组件 我们都会写博客,写文章之后我们要给文章设置目录,设置类型.之后我们在浏览文章的时候就能够按类别进行精确定位到文章,那这个组合搜索我们应该怎么做呢? 首先我们先创建3张表,分别存放文章,文 ...
- Django之组合搜索组件(二)--另附simple_tag的创建使用方法
这次的代码为Django之组合搜索组件(一)的改版,实现的结果和(一)相同,不同的是,这次运用simple_tag方式,使.html程序简化 所以现在就开始编程吧! 首先想使用simple_tag方法 ...
- Django之组合搜索组件(一)
什么是组合搜索呢? 比如你想买车,但手里只有10万块!所以你只能在10万块的车里挑选,但你喜欢黑色,因为觉得很高端大气上档次,说白了就是装逼杠杠的!之后售车姐给你拿了个表表,你看到了低于10万块且颜色 ...
- Django实现组合搜索的方法示例
目录 一.实现方法 二.基本原理 三.代码样例 方法1:纯模板语言实现 方法二:使用simpletag实现 四.其他变化 1.model定义 2.处理函数变化 3.simpletag相应改变 一. ...
随机推荐
- 对于tomcat通过catalina.sh停止服务后,tomcat进程没有退出问题解决办法
例:tomcat路径及名称为/data/apache-tomcat-7.0.67/ vim /data/apache-tomcat-7.0.67/bin/catalina.sh 找到org.apach ...
- python3高级编程
1. SMTP发送邮件 internet相关协议: http:网页访问相关,httplib,urllib,xmlrpclib ftp:文件传输相关, ftplib, urllib nntp:新闻和帖子 ...
- 获取网络图片并显示在picturbox上,byte[]数组转换成Image:
private void getWebPicture_Click(object sender, EventArgs e) { WebRequest request = WebRequest.Creat ...
- MobX基础 ----- 类的静态属性和装饰器
当我们使用MobX的时候,首先要声明一个store, 用来保存状态,它的最基本的语法 如下: class Todo { @observable title = ""; @obser ...
- UVA 11988 Beiju Text
https://vjudge.net/problem/UVA-11988 题目 你有一个破损的键盘.键盘上所有的键都可以正常工作,但有时候Home键或者End键会自动按下.你并不知道键盘存在这一问题, ...
- Nginx 简单的cpu配置
配置指定CPU Nginx建议进程数和CPU数量一致,这样每个CPU都有自己独立的缓存 worker_processes 4; worker_cpu_affinity 1000 0100 0010 0 ...
- 二分图最小点覆盖König定理的简单证明 (加入自己理解)
第一次更改:http://blog.sina.com.cn/s/blog_51cea4040100h152.html 讲的更细致 增广路:https://blog.csdn.net/qq_374572 ...
- 洛谷P1395 会议 题解
$题目$ 为什么这个题会有图论的标签啊,虽然图论也包括找树的重心,可是这很容易让人联想到最短路,但不得不说,这是一个典型的找树的重心模板题. 树的重心是什么? 找到一个点,其所有的子树中最大的子树节点 ...
- JPQL的关联查询
一般情况下,直接使用mysql语句写关联语句,是join on 的形式,如下: select * from tablea as a left join tableb as b on b.tablea_ ...
- HDOJ 5666//快速积,推公式
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5666 题意:给一条直线x+y=q,在(0,0)往x+y=q上面的整数点连线,x+y=q与x,y轴截成的三角 ...