django多条件筛选搜索(项目实例)
多条件搜索在很多网站上都有用到,比如京东,淘宝,51cto,等等好多购物教育网站上都有,当然网上也有很多开源的比楼主写的好的多了去了,仅供参考,哈哈
先来一张效果图吧,不然幻想不出来是什么样的,前端样式很low,毕竟主要是说后台的嘛,前端为了简单测试就简单的写出来啦,喜欢好的样式可以自己去调哈

写后台的应该都知道先从数据库方面入手,所以我们先来设计数据库
数据库设计
1、视频video
class Video(models.Model):
status_choice = (
(0, u'下线'),
(1, u'上线'),
)
level_choice = (
(1, u'初级'),
(2, u'中级'),
(3, u'高级'),
)
status = models.IntegerField(verbose_name='状态', choices=status_choice, default=1)
level = models.IntegerField(verbose_name='级别', choices=level_choice, default=1)
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/')
href = models.CharField(verbose_name='视频地址', max_length=256)
create_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'Video'
verbose_name_plural = u'视频'
def __str__(self):
return self.title
2、视频方向Direction
class Direction(models.Model):
weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)
name = models.CharField(verbose_name='名称', max_length=32) classification = models.ManyToManyField('Classification') class Meta:
db_table = 'Direction'
verbose_name_plural = u'方向(视频方向)' def __str__(self):
return self.name
3、视频分类Classification
class Classification(models.Model):
weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)
name = models.CharField(verbose_name='名称', max_length=32) class Meta:
db_table = 'Classification'
verbose_name_plural = u'分类(视频分类)' def __str__(self):
return self.name
好了大家一起来分析下数据库设计
视频方向Direction类和视频分类Classification多对多关系,因为一个视频方向可以有多个分类,一个视频分类也可以有多个视频方向视频分类
Classification视频分类和视频Video类是一对多关系,因为一个分类肯定有好多视频
- 视频Video类中level_choice 与视频也是一对多关系,因为这个也就这三个分类,所以我选择把他放在内存里面取,毕竟这玩意常年不会变
url映射
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^video-(?P<direction_id>\d+)-(?P<classification_id>\d+)-(?P<level_id>\d+).html', views.video),
]
输入的url为:http://127.0.0.1:8080/video-0-0-0.html
中间第一个0代表视频方向,第二个0代表食品分类,第三个0是视频等级,这个是根据汽车之间那个二手车学的,用着很方便哈哈
0代表全部,然后递增,当选择运维自动化,第一个0就会变成1
下面那些都是一样的道理
前端代码
前端HTML,有用到django的simple_tag,从总体效果图可以看出,前端主要分为两部分,选择部分和视频展示部分
1、选择部分
<h3>选择:</h3>
<div>
{% action_all current_url 1 %} :
{% for item in direction_list %} {% action current_url item %}
{% endfor %}
</div>
<div>
{% action_all current_url 2 %} :
{% for item in class_list %} {% action current_url item %}
{% endfor %}
</div>
<div>
{% action_all current_url 3 %} :
{% for item in level_list %}
{% action current_url item %}
{% endfor %}
</div>
中间主要是用simple_tag来做的前端代码
@register.simple_tag
def action_all(current_url,index):
"""
获取当前url,video-1-1-2.html
:param current_url:
:param item:
:return:
"""
url_part_list = current_url.split('-')
if index == 3:
if url_part_list[index] == "0.html":
temp = "<a href='%s' class='active'>全部</a>"
else:
temp = "<a href='%s'>全部</a>" url_part_list[index] = "0.html"
else:
if url_part_list[index] == "":
temp = "<a href='%s' class='active'>全部</a>"
else:
temp = "<a href='%s'>全部</a>" url_part_list[index] = "" href = '-'.join(url_part_list) temp = temp % (href,)
return mark_safe(temp) @register.simple_tag
def action(current_url, item,index):
# videos-0-0-1.html
# item: id name
# video- 2 -0-0.html
url_part_list = current_url.split('-') if index == 3:
if str(item['id']) == url_part_list[3].split('.')[0]: #如果当前标签被选中
temp = "<a href='%s' class='active'>%s</a>"
else:
temp = "<a href='%s'>%s</a>" url_part_list[index] = str(item['id']) + '.html' #拼接对应位置的部分url
else:
if str(item['id']) == url_part_list[index]:
temp = "<a href='%s' class='active'>%s</a>"
else:
temp = "<a href='%s'>%s</a>" url_part_list[index] = str(item['id']) ur_str = '-'.join(url_part_list) #拼接整体url
temp = temp %(ur_str, item['name']) #生成对应的a标签
return mark_safe(temp) #返回安全的html
2、视频展示区域
<h3>视频:</h3>
{% for item in video_list %}
<a class="item" href="{{ item.href }}">
<img src="/{{ item.img }}" width="300px" height="400px">
<p>{{ item.title }}</p>
<p>{{ item.summary }}</p>
</a>
{% endfor %}
关键来啦关键来啦,最主要的处理部分在这里,往这看,往这看,往这看,主要的事情说三遍哈
视频后台逻辑处理部分
def video(request,*args,**kwargs):
print(kwargs)
# 当前请求的路径
request_path = request.path
# 从数据库获取视频时的filter条件字典
q = {}
# 状态为审核通过的
q['status'] = 1
# 获取url中的视频分类id
class_id = int(kwargs.get('classification_id'))
# 从数据库中获取所有的视频方向(包括视频方向的id和name)
direction_list = models.Direction.objects.all().values('id','name') # 如果视频方向是0
if kwargs.get('direction_id') == '':
# 方向选择全部
# 方向id=0,即获取所有的视频分类(包括视频分类的id和name)
class_list = models.Classification.objects.all().values('id', 'name')
# 如果视频分类id也为0,即全部分类,那就什么都不用做,因为已经全取出来了
if kwargs.get('classification_id') == '':
pass
else:
# 如果视频分类不是全部,过滤条件为视频分类id在[url中的视频分类id]
q['classification_id__in'] = [class_id,] else:
print('方向不为0')
# 方向选择某一个方向,
# 如果分类是0
if kwargs.get('classification_id') == '':
print('分类为0')
# 获取已选择的视频方向
obj = models.Direction.objects.get(id=int(kwargs.get('direction_id')))
# 获取该方向的所有视频分类
class_list = obj.classification.all().values('id', 'name')
# 获取所有视频分类对应的视频分类id
id_list = list(map(lambda x: x['id'], class_list))
# 过滤条件为视频分类id in [该方向下的所有视频分类id]
q['classification_id__in'] = id_list
else:
# 方向不为0,分类也不为0
obj = models.Direction.objects.get(id=int(kwargs.get('direction_id')))
class_list = obj.classification.all().values('id', 'name')
id_list = list(map(lambda x:x['id'], class_list))
# 过滤条件为视频分类id in [已经选择的视频分类id]
q['classification_id__in'] = [class_id,]
print('分类不为0')
# 当前分类如果在获取的所有分类中,则方向下的所有相关分类显示
# 当前分类如果不在获取的所有分类中,
if int(kwargs.get('classification_id')) in id_list:
pass
else:
print('不再,获取指定方向下的所有分类:选中的回到全部')
url_part_list = request_path.split('-')
url_part_list[2] = ''
request_path = '-'.join(url_part_list)
# 视频等级id
level_id = int(kwargs.get('level_id'))
if level_id == 0:
pass
else:
# 过滤条件增加视频等级
q['level'] = level_id # 取出相对应的视频
video_list = models.Video.objects.filter(**q).values('title','summary', 'img', 'href')
# 把视频等级转化为单个标签是字典格式,整体是列表格式
ret = map(lambda x:{"id": x[0], 'name': x[1]}, models.Video.level_choice)
level_list = list(ret)
return render(request, 'video.html', {'direction_list': direction_list,
'class_list': class_list,
'level_list': level_list,
'current_url': request_path,
"video_list": video_list})
django多条件筛选搜索(项目实例)的更多相关文章
- Django多条件筛选查询
转自:https://www.jianshu.com/p/a86281df530e Django多条件筛选查询 主模型只存在外键一对多关系 模型设计 # 快捷筛选状态 class Status(mod ...
- jquery实现多条件筛选特效代码分享
本文实例讲述了jquery实现多条件筛选特效.分享给大家供大家参考.具体如下:jquery实现的多条件搜索表单带日期选择表格表单效果源码,是一段实现了多个条件筛选搜索的特效代码,多条件拥有时间.地点. ...
- JS前端数据多条件筛选(商品搜索)
有时候也会需要在前端进行数据筛选,增强交互体验.当数据可用的筛选条件较多时,把逻辑写死会给后期维护带来很大麻烦.下面是我自己写的一个简单的筛选器,筛选条件可以根据数据包含的字段动态设置. 仿照京东的筛 ...
- 织梦CMS实现多条件筛选功能
用织梦实现筛选的功能,其实主要就是运用到了织梦的高级搜索功能,然后用ajax去post替换掉本来的结果就可以了. 其实筛选的话,主要有两个问题需要解决,一个是前台的筛选实现,一个是后台根据前台的点击, ...
- HBase多条件筛选查询方案
最近的项目需要使用Hbase做实时查询,由于Hbase只支持一级索引,也就是使用rowkey作为索引查询,所以对于多条件筛选查询的支持不够,在不建立二级索引的情况下,只能使用Hbase API中提供的 ...
- 关于web多标签多条件筛选的思考以及缓存的正确使用方法(上)
做项目的过程中,发现一次远程链接数据库的耗时大概是300ms~400ms,切身体会到了前辈们经常说的减少链接的重要性,用了缓存后页面的打开时间从1.5s减少到400ms 前提: 那么来说一说正题,we ...
- js前端 多条件筛选查询
一.前言 在做项目中,遇到多条件筛选案例.实现完成以后,我将我做的代码分享在这里,希望可以帮助到其他朋友. 二.效果截图 三.实现代码 首先我先类型.类别.职位分成三块来处理,如果传到服务器端的话,就 ...
- Hbase条件筛选
需求来自于,模糊查找当天的所有记录,并查找对应列的记录数 public static void main(String[] args) throws Exception{ //创建HBase连接 Co ...
- iOS: 悬浮的条件筛选框使用二
一.介绍: 在前面已经介绍了一种条件悬浮框,使用的是tableView的Plain分组样式实现的,因为这是tableView本身就具备的功能,分组悬浮效果.这次我来介绍第二种更加简单的方法,采用两个S ...
随机推荐
- log4net入门
简介 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题. 经验表明,日志 ...
- 实战-Fluxion与wifi热点伪造、钓鱼、中间人攻击、wifi破解
原作者:PG 整理:玄魂工作室-荣杰 目录: 0x00-Fluxion是什么 0x01-Fluxion工作原理 0x02-Kali上安装fluxion 0x03-Fluxion工具使用说明+实 ...
- C#Light for Unity 新例子
近来有好几位询问C#Lite在Unity中使用的问题 我专门为C#Lite制作了 for Unity的新例子 ,这个例子名为languagetest 包含17个语言特性测试的文件 其中_6004_展示 ...
- 基于Task的异步模式--全面介绍
今天是国庆长假第一天,也是今天十月的开始.每到这个时候都是看海的季节-一个看"人海"的季节.反正我是不想在这样一个尴尬期出去放松自己,于是不如在家写写博客,长点本领呢.今天就来给大 ...
- 每天一个linux命令(61):wget命令
Linux系统中的wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器.wget支持HTTP,HTTPS和FTP ...
- EF架构~为EF DbContext生成的实体添加注释(T5模板应用)
回到目录 相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回 EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbCo ...
- jQuery使用方法
使用jQuery的第一步,往往就是将一个选择表达式,放进构造函数jQuery()(简写为$),然后得到被选中的元素. 选择表达式可以是CSS选择器: 1 $(document)//选择整个文档对象2 ...
- [Redis]Redis 概述及基本使用规范.
1 nosql的简介 1.1 nosql简介 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经显得力不从心,暴露 ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- atitit 短信验证码的源码实现 .docx
atitit 短信验证码的源码实现 .docx 参考 Atitit usrQBM1603短信验证码规范1 主要方法1 源码实现1 参考 Atitit usrQBM1603短信验证码规范 主要方法 L ...