加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Django实现组合搜索

发布时间:2020-12-15 17:17:11 所属栏目:大数据 来源:网络整理
导读: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实现(本质是简化了纯模板语言的判断) 原理都
<tr>
<td><span style="font-size: 16px;">一、实现方法</td>
</tr></table>

1.纯模板语言实现

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

<table style="height: 30px; background-color: #afeeee; width: 1266px; ; width: 1266px;" border="0">

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

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

url(rd+).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-(?Pd+)-(?Pd+).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]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读