一、实现方法
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{ background-color: rebeccapurple; } </ 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{ background-color: rebeccapurple; } </ 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