Django实现组合搜索的方法示例
一、实现方法
1.纯模板语言实现
2.自定义simpletag实现(本质是简化了纯模板语言的判断)
二、基本原理
原理都是通过django路由系统,匹配url筛选条件,将筛选条件作为数据库查询结果,返回给前端。
例如:路由系统中的url格式是这样:
1
|
url(r '^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html' ,views. filter ) |
其中article_type_id和category_id和数据库中字段是相对应的,此时当一个url为article-1-2.html时候,后台处理函数的参数将是一个字典{'article_type_id': 1, 'category_id': 1},然后将该条件作为数据库查询条件,最后得出结果返回给前端
三、代码样例
方法1:纯模板语言实现
urls.py
1
2
3
4
5
6
7
8
9
10
|
#!/usr/bin/env python3 #_*_ coding:utf-8 _*_ #Author:wd from django.conf.urls import url from . import views urlpatterns = [ url(r '^$' ,views.index), url(r '^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html' ,views. filter ), ] |
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from django.db import models class Category(models.Model): caption = models.CharField(max_length = 64 ) class Article_type(models.Model): caption = models.CharField(max_length = 64 ) class Article(models.Model): title = models.CharField(max_length = 64 ) content = models.CharField(max_length = 256 ) category = models.ForeignKey(to = 'Category' ) article_type = models.ForeignKey(to = 'Article_type' |
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
def filter (request, * args, * * kwargs): if request.method = = "GET" : condition = {} for k,v in kwargs.items(): kwargs[k] = int (v) #模板if判断row.id是数字,所以这里需要转换 if v = = "0" : #当条件为0代表所选的是全部,那么就不必要加入到过滤条件中 pass else : condition[k] = int (v) aritcle = models.Article.objects. filter ( * * condition) aritcle_type = models.Article_type.objects. all () aritcle_category = models.Category.objects. all () return render(request, 'search.html' ,{ 'aritcle' :aritcle, 'article_type' :aritcle_type, 'article_category' :aritcle_category, 'article_arg' :kwargs, #将当前的筛选条件传递给html }) |
html模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
<!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" > < title >Title</ title > < style > .container a{ display: inline-block; padding: 3px 5px; margin: 5px; border: 1px solid #dddddd ; } .active{
} </ style > </ head > < body > < h1 >搜索条件</ h1 > < div class = "container" > {% if article_arg.article_type_id == 0 %} < a class = "active" href = "/cmdb/article-0-{{ article_arg.category_id }}.html" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >全部</ a > {% else %} < a href = "/cmdb/article-0-{{ article_arg.category_id }}.html" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >全部</ a > {% endif %} {% for row in article_type %} {% if row.id == article_arg.article_type_id %} < a class = "active" href = "/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >{{ row.caption }}</ a > {% else %} < a href = "/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >{{ row.caption }}</ a > {% endif %} {% endfor %} </ div > < div class = "container" > {% if article_arg.category_id == 0 %} < a class = "active" href = "/cmdb/article-{{ article_arg.article_type_id }}-0.html" rel = "external nofollow" rel = "external nofollow" >全部</ a > {% else %} < a href = "/cmdb/article-{{ article_arg.article_type_id }}-0.html" rel = "external nofollow" rel = "external nofollow" >全部</ a > {% endif %} {% for row in article_category %} {% if row.id == article_arg.category_id %} < a class = "active" href = "/cmdb/article-{{ article_arg.article_type_id }}-{{ row.id }}.html" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >{{ row.caption }}</ a > {% else %} < a href = "/cmdb/article-{{ article_arg.article_type_id }}-{{ row.id }}.html" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >{{ row.caption }}</ a > {% endif %} {% endfor %} </ div > < h1 >查询结果</ h1 > < div > {% for row in aritcle %} < div >{{ row.id }}-{{ row.title }}</ div > {% endfor %} </ div > </ body > </ html > |
方法二:使用simpletag实现
定义simpletag
myfilter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#!/usr/bin/env python3 #_*_ coding:utf-8 _*_ #Author:wd from django import template from django.utils.safestring import mark_safe register = template.Library() @register .simple_tag def filter_all(article_arg,condition): ''' 处理条件为全部 :param article_arg: 当前url字典:如{'article_type_id': 1, 'category_id': 1} :param condition: 要处理的条件,如article_type_id,用于区分当前处理选择了那个全部 :return: 返回下面页面形式 {% if article_arg.article_type_id == 0 %} <a class="active" href="/cmdb/article-0-{{ article_arg.category_id }}.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >全部</a> {% else %} <a href="/cmdb/article-0-{{ article_arg.category_id }}.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >全部</a> {% endif %} {% for row in article_type %} {% if row.id == article_arg.article_type_id %} <a class="active" href="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{{ row.caption }}</a> {% else %} <a href="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{{ row.caption }}</a> {% endif %} {% endfor %} ''' if condition = = 'article_type_id' : if article_arg[condition] = = 0 : print (article_arg[ 'category_id' ]) res = '<a class ="active" href="/cmdb/article-0-%s.html" rel="external nofollow" rel="external nofollow" >全部</a>' % article_arg[ 'category_id' ] else : res = '<a href="/cmdb/article-0-%s.html" rel="external nofollow" rel="external nofollow" >全部</a>' % article_arg[ 'category_id' ] return mark_safe(res) elif condition = = 'category_id' : if article_arg[ 'category_id' ] = = 0 : res = '<a class ="active" href="/cmdb/article-%s-0.html" rel="external nofollow" rel="external nofollow" >全部</a>' % article_arg[ 'article_type_id' ] else : res = '<a href="/cmdb/article-%s-0.html" rel="external nofollow" rel="external nofollow" >全部</a>' % article_arg[ 'article_type_id' ] return mark_safe(res) @register .simple_tag def filter_type(article_type,article_arg): ''' :param article_type: article_type对象 :param article_arg: 当前url字典 :return: {% for row in article_type %} {% if row.id == article_arg.article_type_id %} <a class="active" href="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{{ row.caption }}</a> {% else %} <a href="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{{ row.caption }}</a> {% endif %} {% endfor %} ''' res = [] for row in article_type: if row. id = = article_arg[ 'article_type_id' ]: temp = '<a class="active" href="/cmdb/article-%s-%s.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >%s</a>' % (row. id ,article_arg[ 'category_id' ],row.caption) else : temp = '<a href="/cmdb/article-%s-%s.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >%s</a>' % (row. id , article_arg[ 'category_id' ],row.caption) res.append(temp) return mark_safe("".join(res)) @register .simple_tag def filter_category(article_category,article_arg): ''' :param article_type: article_category对象 :param article_arg: 当前url字典 :return: {% for row in article_category %} {% if row.id == article_arg.category_id %} <a class="active" href="/cmdb/article-{{ article_arg.article_type_id }}-{{ row.id }}.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{{ row.caption }}</a> {% else %} <a href="/cmdb/article-{{ article_arg.article_type_id }}-{{ row.id }}.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{{ row.caption }}</a> {% endif %} {% endfor %} ''' res = [] for row in article_category: if row. id = = article_arg[ 'category_id' ]: temp = '<a class="active" href="/cmdb/article-%s-%s.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >%s</a>' % (article_arg[ 'article_type_id' ],row. id ,row.caption) else : temp = '<a href="/cmdb/article-%s-%s.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >%s</a>' % (article_arg[ 'article_type_id' ],row. id ,row.caption) res.append(temp) return mark_safe("".join(res)) |
html模板
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
{% load myfilter %} <!DOCTYPE html> < html lang = "en" > < head > < meta charset = "UTF-8" > < title >Title</ title > < style > .container a{ display: inline-block; padding: 3px 5px; margin: 5px; border: 1px solid #dddddd ; } .active{
} </ style > </ head > < body > < h1 >搜索条件</ h1 > < div class = "container" > {% filter_all article_arg 'article_type_id' %} {% filter_type article_type article_arg %} </ div > < div class = "container" > {% filter_all article_arg 'category_id' %} {% filter_category article_category article_arg %} </ div > < h1 >查询结果</ h1 > < div > {% for row in aritcle %} < div >{{ row.id }}-{{ row.title }}</ div > {% endfor %} </ div > </ body > </ html > |
ps附上简图:
四、其他变化
在如上的示例中,我们的过滤条件是从数据库中拿到,有时候我们定义的时候使用的是静态字段,此时组合搜索会稍微修改。
1.model定义
1
2
3
4
5
6
7
8
9
|
class Article(models.Model): title = models.CharField(max_length = 64 ) content = models.CharField(max_length = 256 ) category = models.ForeignKey(to = 'Category' ) article_type = ( #使用静态字段放入内存 ( 1 , 'linux' ), ( 2 , 'python' ), ( 3 , 'go' ), ) |
2.处理函数变化
1
2
|
###获取#### aritcle_type = models.Article.article_type #直接获取类的静态字段 |
3.simpletag相应改变
1
2
3
|
###由于我们传递的元祖,所以取值使用元祖方式 article_type[ 0 ] # 筛选条件id article_type[ 1 ] # 筛选条件名称 |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
原文链接:http://www.cnblogs.com/wdliu/p/8331375.html
Django实现组合搜索的方法示例的更多相关文章
- Django之组合搜索组件(二)--另附simple_tag的创建使用方法
这次的代码为Django之组合搜索组件(一)的改版,实现的结果和(一)相同,不同的是,这次运用simple_tag方式,使.html程序简化 所以现在就开始编程吧! 首先想使用simple_tag方法 ...
- Django实现组合搜索
一.实现方法 1.纯模板语言实现 2.自定义simpletag实现(本质是简化了纯模板语言的判断) 二.基本原理 原理都是通过django路由系统,匹配url筛选条件,将筛选条件作为数据库查询结果,返 ...
- python(Django之组合搜索、JSONP、XSS过滤 )
一.组合搜索 二.jsonp 三.xss过滤 一.组合搜索 首先,我们在做一个门户网站的时候,前端肯定是要进行搜索的,但是如果搜索的类型比较多的话,怎么做才能一目了然的,这样就引出了组合搜索的这个案例 ...
- Django中组合搜索功能
需求分析 很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,看个例子吧: 注意红框中的标识,我们可以根据URL来做组合搜索. video- ...
- Django学习---组合搜索组件
组合搜索组件 我们都会写博客,写文章之后我们要给文章设置目录,设置类型.之后我们在浏览文章的时候就能够按类别进行精确定位到文章,那这个组合搜索我们应该怎么做呢? 首先我们先创建3张表,分别存放文章,文 ...
- Django之组合搜索组件(一)
什么是组合搜索呢? 比如你想买车,但手里只有10万块!所以你只能在10万块的车里挑选,但你喜欢黑色,因为觉得很高端大气上档次,说白了就是装逼杠杠的!之后售车姐给你拿了个表表,你看到了低于10万块且颜色 ...
- Django 之组合搜索
现在很多网站都会有这样的组合搜索功能,其实质是几个模型之间组合对数据库进行查询,并将结果显示到页面上. 每一行都是一个模型,模型之间有着连表关系(一对多.多对多等) 模型设计 总共四个模型:分别为方向 ...
- Django实现瀑布流,组合搜索
Django中组合搜索功能 需求分析 很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,看个例子吧: 注意红框中的标识,我们可以根据URL ...
- django实现瀑布流、组合搜索、阶梯评论、验证码
django实现图片瀑布流布局 我们在一些图片网站上经常会看到,满屏都是图片,而且图片都大小不一,却可以按空间排列.默认一个div是占用一行,当想把div里的图片并排显示的时候,只能使用float属性 ...
随机推荐
- 一个架构合理的UITableView应该是如何的?
原文: http://www.chentoo.com/?p=200 iOS 开发中,UITableView 应该是最经常使用到的了.完毕一个UITableView应该实现他的DataSource和De ...
- 09-hibernate单表操作(1)
1,单一主键 2,基本类型 3,对象类型 4,组件属性 5,单表操作 单一主键 常用生成策略: assigned 有程序员生成(手工) native 由数据库底层,如果是mysql是increment ...
- Docker Container同时启动多服务 supervisor
Docker Container同时启动多服务 转载请注明来自:http://blog.csdn.net/wsscy2004 昨天踩了个天坑,我有一个基本的镜像centos6.5+ssh,是通过Doc ...
- LaTeX 中使用三级标题
需要在导言区加入命令:\setcounter{secnumdepth}{4} 而后: \section{一级标题} \subsection{二级标题} \subsubsection{三级标题}
- Python 使用 UTF-8 编码(转)
Python 使用 UTF-8 编码(转) 原文出处:http://blog.chenlb.com/2010/01/python-use-utf-8.html 一般我喜欢用 utf-8 编码,在 py ...
- sublime for mac 注册码
https://www.jianshu.com/p/04e1b65dd2c0https://fatesinger.com/100121
- android - px(像素)、dpi(像素密度)、dip(密度无关像素)之间的关系
使用ImageView会遇到的问题 在Android应用中,都少不了图片的显示,ImageView,轮播图,ViewPager等等,很多都是来显示图片的,很多时候,我们都希望图片能够在宽度上填充父窗体 ...
- C++类成员指针(指向类成员的指针)
1.指向类的数据成员的指针: 声明格式如下: <类型说明符> <类名>::* <指针变量名>; 2.指向类的成员函数的指针: 声明格式如下: <类型说明符 ...
- zoj 1109 Language of FatMouse(字典树)
Language of FatMouse Time Limit: 10 Seconds Memory Limit: 32768 KB We all know that FatMouse do ...
- Unix系统编程(四)creat系统调用
我好疑惑啊,creat系统调用为啥没有以e结尾呢?搞得我每次都怀疑我敲错了. 在早期的UNIX实现中,open只有两个参数,无法创建新文件,而是使用creat系统调用创建并打开一个新文件. int c ...