Django实现组合搜索的方法示例
2024-08-30 01:20:23
一、实现方法
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
最新文章
- IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用
- 迭代器 iterator(二): 用iterator遍历arraylist
- jsp struts标签迭代各种数据
- Linux下进程的建立
- HttpClient(4.3.5) - ResponseHandler
- C++ 智能指针auto_ptr详解
- a标签中的href=";#";与href=";javascript:void(0)";区别
- C与C++动态分配二维数组
- 【LeetCode题解】数组Array
- linux 下maven安装
- 性能测试培训:批量执行Jmeter脚本之ant调用
- 2017-2018-1 1623 bug终结者 冲刺006
- SVN使用指引(Windows)
- H5的Web Audio Api
- scrum学习笔记
- 零基础http代理http完美代理访问
- Creating Reusable XAML User Controls with Xamarin Forms
- 【apache】phpstudy中apache 隐藏入口文件index.php (解决no input file specified错误)
- Nginx启动/重启脚本详解
- Linux IO模式及 select、poll、epoll详解及源码(转)
热门文章
- loadrunner参数使用总结
- C#线程同步技术(二) Interlocked 类
- RESTORE DATABASE命令还原SQLServer 数据库 bak
- 在 Linux 客户端配置基于 Kerberos 身份验证的 NFS 服务器
- 完整学习使用CSS动画【翻译】
- 用Doxygen+Graphviz生成函数调用流程图(转)
- 写一个简单的form表单,当光标离开表单的时候表单的值发送给后台
- IntelliJ IDEA代码编码区提示库源不匹配字节码解决办法
- hdu 1022 Train Problem
- Dreamhost 提示No input file specified. 的解决的方法