Django实现组合搜索的方法示例
Posted AmilyAmily
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django实现组合搜索的方法示例相关的知识,希望对你有一定的参考价值。
一、实现方法
1.纯模板语言实现
2.自定义simpletag实现(本质是简化了纯模板语言的判断)
二、基本原理
原理都是通过django路由系统,匹配url筛选条件,将筛选条件作为数据库查询结果,返回给前端。
例如:路由系统中的url格式是这样:
1
|
|
其中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" > 以上是关于Django实现组合搜索的方法示例的主要内容,如果未能解决你的问题,请参考以下文章
|