Django实现组合搜索

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0"><tr>
<td><span style="font-size: 16px;">一、实现方法</td>
</tr></table>

1.纯模板语言实现

2.自定义simpletag实现(本质是简化了纯模板语言的判断)

原理都是通过django路由系统,匹配url筛选条件,将筛选条件作为数据库查询结果,返回给前端。

例如:路由系统中的url格式是这样:

url(r\d+)-(?P\d+).html,views.filter)

其中article_type_id和category_id和数据库中字段是相对应的,此时当一个url为article-1-2.html时候,后台处理函数的参数将是一个字典{'article_type_id': 1,'category_id': 1},然后将该条件作为数据库查询条件,最后得出结果返回给前端

方法1:纯模板语言实现

urls.py

django.conf.urls <span style="color: #0000ff;">from . <span style="color: #0000ff;">import<span style="color: #000000;"> views
urlpatterns
=<span style="color: #000000;"> [
url(r
<span style="color: #800000;">'
<span style="color: #800000;">^$
<span style="color: #800000;">'
<span style="color: #000000;">,views.index),url(r
<span style="color: #800000;">'<span style="color: #800000;">^article-(?P\d+)-(?P\d+).html<span style="color: #800000;">'<span style="color: #000000;">,views.filter),]

models.py

django.db <span style="color: #0000ff;">class<span style="color: #000000;"> Category(models.Model):
caption
=models.CharField(max_length=64<span style="color: #000000;">)

<span style="color: #0000ff;">class<span style="color: #000000;"> Article_type(models.Model):
caption=models.CharField(max_length=64<span style="color: #000000;">)

<span style="color: #0000ff;">class<span style="color: #000000;"> Article(models.Model):
title=models.CharField(max_length=64<span style="color: #000000;">)
content=models.CharField(max_length=256<span style="color: #000000;">)
category=models.ForeignKey(to=<span style="color: #800000;">'<span style="color: #800000;">Category<span style="color: #800000;">'<span style="color: #000000;">)
article_type=models.ForeignKey(to=<span style="color: #800000;">'<span style="color: #800000;">Article_type<span style="color: #800000;">'

views.py

filter(request,*args,** request.method=== k,v =int(v) v==: ==models.Article.objects.filter(**== render(request,:kwargs, })

html模板

Title
    <span style="background-color: #f5f5f5; color: #000000;"&gt;}</span>
<span style="color: #0000ff;"&gt;</</span><span style="color: #800000;"&gt;style</span><span style="color: #0000ff;"&gt;></span>

<span style="color: #0000ff;"></<span style="color: #800000;">head<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">h1<span style="color: #0000ff;">>搜索条件<span style="color: #0000ff;"></<span style="color: #800000;">h1<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">div <span style="color: #ff0000;">class<span style="color: #0000ff;">="container"<span style="color: #0000ff;">><span style="color: #000000;">
{% if article_arg.article_type_id == 0 %}
<span style="color: #0000ff;"><<span style="color: #800000;">a <span style="color: #ff0000;">class<span style="color: #0000ff;">="active"<span style="color: #ff0000;"> href<span style="color: #0000ff;">="/cmdb/article-0-{{ article_arg.category_id }}.html"<span style="color: #0000ff;">>全部<span style="color: #0000ff;"></<span style="color: #800000;">a<span style="color: #0000ff;">><span style="color: #000000;">
{% else %}
<span style="color: #0000ff;"><<span style="color: #800000;">a <span style="color: #ff0000;">href<span style="color: #0000ff;">="/cmdb/article-0-{{ article_arg.category_id }}.html"<span style="color: #0000ff;">>全部<span style="color: #0000ff;"></<span style="color: #800000;">a<span style="color: #0000ff;">><span style="color: #000000;">
{% endif %}
{% for row in article_type %}
{% if row.id == article_arg.article_type_id %}
<span style="color: #0000ff;"><<span style="color: #800000;">a <span style="color: #ff0000;">class<span style="color: #0000ff;">="active"<span style="color: #ff0000;"> href<span style="color: #0000ff;">="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html"<span style="color: #0000ff;">>{{ row.caption }}<span style="color: #0000ff;"></<span style="color: #800000;">a<span style="color: #0000ff;">><span style="color: #000000;">
{% else %}
<span style="color: #0000ff;"><<span style="color: #800000;">a <span style="color: #ff0000;">href<span style="color: #0000ff;">="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html"<span style="color: #0000ff;">>{{ row.caption }}<span style="color: #0000ff;"></<span style="color: #800000;">a<span style="color: #0000ff;">><span style="color: #000000;">
{% endif %}
{% endfor %}
<span style="color: #0000ff;"></<span style="color: #800000;">div<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">div <span style="color: #ff0000;">class<span style="color: #0000ff;">="container"<span style="color: #0000ff;">><span style="color: #000000;">
{% if article_arg.category_id == 0 %}
<span style="color: #0000ff;"><<span style="color: #800000;">a <span style="color: #ff0000;">class<span style="color: #0000ff;">="active"<span style="color: #ff0000;"> href<span style="color: #0000ff;">="/cmdb/article-{{ article_arg.article_type_id }}-0.html"<span style="color: #0000ff;">>全部<span style="color: #0000ff;"></<span style="color: #800000;">a<span style="color: #0000ff;">><span style="color: #000000;">
{% else %}
<span style="color: #0000ff;"><<span style="color: #800000;">a <span style="color: #ff0000;">href<span style="color: #0000ff;">="/cmdb/article-{{ article_arg.article_type_id }}-0.html"<span style="color: #0000ff;">>全部<span style="color: #0000ff;"></<span style="color: #800000;">a<span style="color: #0000ff;">><span style="color: #000000;">
{% endif %}
{% for row in article_category %}
{% if row.id == article_arg.category_id %}
<span style="color: #0000ff;"><<span style="color: #800000;">a <span style="color: #ff0000;">class<span style="color: #0000ff;">="active"<span style="color: #ff0000;"> href<span style="color: #0000ff;">="/cmdb/article-{{ article_arg.article_type_id }}-{{ row.id }}.html"<span style="color: #0000ff;">>{{ row.caption }}<span style="color: #0000ff;"></<span style="color: #800000;">a<span style="color: #0000ff;">><span style="color: #000000;">
{% else %}
<span style="color: #0000ff;"><<span style="color: #800000;">a <span style="color: #ff0000;">href<span style="color: #0000ff;">="/cmdb/article-{{ article_arg.article_type_id }}-{{ row.id }}.html"<span style="color: #0000ff;">>{{ row.caption }}<span style="color: #0000ff;"></<span style="color: #800000;">a<span style="color: #0000ff;">><span style="color: #000000;">
{% endif %}
{% endfor %}
<span style="color: #0000ff;"></<span style="color: #800000;">div<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">h1<span style="color: #0000ff;">>查询结果<span style="color: #0000ff;"></<span style="color: #800000;">h1<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">div<span style="color: #0000ff;">><span style="color: #000000;">
{% for row in aritcle %}
<span style="color: #0000ff;"><<span style="color: #800000;">div<span style="color: #0000ff;">>{{ row.id }}-{{ row.title }}<span style="color: #0000ff;"></<span style="color: #800000;">div<span style="color: #0000ff;">><span style="color: #000000;">
{% endfor %}
<span style="color: #0000ff;"></<span style="color: #800000;">div<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">>

方法二:使用simpletag实现

定义simpletag,参考博客

myfilter.py

django django.utils.safestring register=<span style="color: #000000;">template.Library()
@register.simple_tag
<span style="color: #0000ff;">def
<span style="color: #000000;"> filter_all(article_arg,condition):
<span style="color: #800000;">'''
<span style="color: #800000;">
处理条件为全部
: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">全部

{% else %}
<a href="/cmdb/article-0-{{ article_arg.category_id }}.html">全部
{% 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">{{ row.caption }}
{% else %}
<a href="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html">{{ row.caption }}
{% endif %}
{% endfor %}
<span style="color: #800000;">'''
<span style="color: #0000ff;">if condition==<span style="color: #800000;">'<span style="color: #800000;">article_type_id<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">if article_arg[condition]==<span style="color: #000000;">0:
<span style="color: #0000ff;">print(article_arg[<span style="color: #800000;">'<span style="color: #800000;">category_id<span style="color: #800000;">'<span style="color: #000000;">])
res= <span style="color: #800000;">'<span style="color: #800000;"><a class ="active" href="/cmdb/article-0-%s.html">全部<span style="color: #800000;">' % article_arg[<span style="color: #800000;">'<span style="color: #800000;">category_id<span style="color: #800000;">'<span style="color: #000000;">]
<span style="color: #0000ff;">else<span style="color: #000000;">:
res = <span style="color: #800000;">'<span style="color: #800000;"><a href="/cmdb/article-0-%s.html">全部<span style="color: #800000;">' % article_arg[<span style="color: #800000;">'<span style="color: #800000;">category_id<span style="color: #800000;">'<span style="color: #000000;">]
<span style="color: #0000ff;">return<span style="color: #000000;"> mark_safe(res)
<span style="color: #0000ff;">elif condition==<span style="color: #800000;">'<span style="color: #800000;">category_id<span style="color: #800000;">'<span style="color: #000000;">:
<span style="color: #0000ff;">if article_arg[<span style="color: #800000;">'<span style="color: #800000;">category_id<span style="color: #800000;">']==<span style="color: #000000;">0:
res = <span style="color: #800000;">'<span style="color: #800000;"><a class ="active" href="/cmdb/article-%s-0.html">全部<span style="color: #800000;">' % article_arg[<span style="color: #800000;">'<span style="color: #800000;">article_type_id<span style="color: #800000;">'<span style="color: #000000;">]
<span style="color: #0000ff;">else<span style="color: #000000;">:
res = <span style="color: #800000;">'<span style="color: #800000;"><a href="/cmdb/article-%s-0.html">全部<span style="color: #800000;">' % article_arg[<span style="color: #800000;">'<span style="color: #800000;">article_type_id<span style="color: #800000;">'<span style="color: #000000;">]
<span style="color: #0000ff;">return<span style="color: #000000;"> mark_safe(res)

@register.simple_tag
<span style="color: #0000ff;">def<span style="color: #000000;"> filter_type(article_type,article_arg):
<span style="color: #800000;">'''<span style="color: #800000;">
: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">{{ row.caption }}
{% else %}
<a href="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html">{{ row.caption }}
{% endif %}
{% endfor %}
<span style="color: #800000;">'''<span style="color: #000000;">
res=<span style="color: #000000;">[]
<span style="color: #0000ff;">for row <span style="color: #0000ff;">in<span style="color: #000000;"> article_type:
<span style="color: #0000ff;">if row.id== article_arg[<span style="color: #800000;">'<span style="color: #800000;">article_type_id<span style="color: #800000;">'<span style="color: #000000;">]:
temp=<span style="color: #800000;">'<span style="color: #800000;"><a class="active" href="/cmdb/article-%s-%s.html">%s<span style="color: #800000;">' %(row.id,article_arg[<span style="color: #800000;">'<span style="color: #800000;">category_id<span style="color: #800000;">'<span style="color: #000000;">],row.caption)
<span style="color: #0000ff;">else<span style="color: #000000;">:
temp = <span style="color: #800000;">'<span style="color: #800000;"><a href="/cmdb/article-%s-%s.html">%s<span style="color: #800000;">' % (row.id,row.caption)
res.append(temp)
<span style="color: #0000ff;">return mark_safe(<span style="color: #800000;">""<span style="color: #000000;">.join(res))

@register.simple_tag
<span style="color: #0000ff;">def<span style="color: #000000;"> filter_category(article_category,article_arg):
<span style="color: #800000;">'''<span style="color: #800000;">
: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">{{ row.caption }}
{% else %}
<a href="/cmdb/article-{{ article_arg.article_type_id }}-{{ row.id }}.html">{{ row.caption }}
{% endif %}
{% endfor %}
<span style="color: #800000;">'''<span style="color: #000000;">
res=<span style="color: #000000;">[]
<span style="color: #0000ff;">for row <span style="color: #0000ff;">in<span style="color: #000000;"> article_category:
<span style="color: #0000ff;">if row.id== article_arg[<span style="color: #800000;">'<span style="color: #800000;">category_id<span style="color: #800000;">'<span style="color: #000000;">]:
temp=<span style="color: #800000;">'<span style="color: #800000;"><a class="active" href="/cmdb/article-%s-%s.html">%s<span style="color: #800000;">' %(article_arg[<span style="color: #800000;">'<span style="color: #800000;">article_type_id<span style="color: #800000;">'<span style="color: #000000;">],row.id,row.caption)
<span style="color: #0000ff;">else<span style="color: #000000;">:
temp = <span style="color: #800000;">'<span style="color: #800000;"><a href="/cmdb/article-%s-%s.html">%s<span style="color: #800000;">' % (article_arg[<span style="color: #800000;">'<span style="color: #800000;">article_type_id<span style="color: #800000;">'<span style="color: #000000;">],row.caption)
res.append(temp)
<span style="color: #0000ff;">return mark_safe(<span style="color: #800000;">"".join(res))

html模板

Title
    <span style="background-color: #f5f5f5; color: #000000;"&gt;}</span>
<span style="color: #0000ff;"&gt;</</span><span style="color: #800000;"&gt;style</span><span style="color: #0000ff;"&gt;></span>

<span style="color: #0000ff;"></<span style="color: #800000;">head<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">h1<span style="color: #0000ff;">>搜索条件<span style="color: #0000ff;"></<span style="color: #800000;">h1<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">div <span style="color: #ff0000;">class<span style="color: #0000ff;">="container"<span style="color: #0000ff;">><span style="color: #000000;">
{% filter_all article_arg 'article_type_id' %}
{% filter_type article_type article_arg %}
<span style="color: #0000ff;"></<span style="color: #800000;">div<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">div <span style="color: #ff0000;">class<span style="color: #0000ff;">="container"<span style="color: #0000ff;">><span style="color: #000000;">
{% filter_all article_arg 'category_id' %}
{% filter_category article_category article_arg %}
<span style="color: #0000ff;"></<span style="color: #800000;">div<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">h1<span style="color: #0000ff;">>查询结果<span style="color: #0000ff;"></<span style="color: #800000;">h1<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">div<span style="color: #0000ff;">><span style="color: #000000;">
{% for row in aritcle %}
<span style="color: #0000ff;"><<span style="color: #800000;">div<span style="color: #0000ff;">>{{ row.id }}-{{ row.title }}<span style="color: #0000ff;"></<span style="color: #800000;">div<span style="color: #0000ff;">><span style="color: #000000;">
{% endfor %}
<span style="color: #0000ff;"></<span style="color: #800000;">div<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">>

ps附上简图:

四、其他变化在如上的示例中,我们的过滤条件是从数据库中拿到,有时候我们定义的时候使用的是静态字段,此时组合搜索会稍微修改。

1.model定义

=models.CharField(max_length=64=models.CharField(max_length=256=models.ForeignKey(to==( (1,2,3,

2.处理函数变化

aritcle_type=models.Article.article_type

3.simpletag相应改变

article_type[0] article_type[1]

相关文章

注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有...
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供...
一、Django介绍Python下有许多款不同的 Web 框架。Django是重...
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小...
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的...