一、实现方法

1.纯模板语言实现

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

二、基本原理

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

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

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

#!/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

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

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代表所选的是全部,那么就不必要加入到过滤条件中
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模板

<!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">全部</a>
{% else %}
<a href="/cmdb/article-0-{{ article_arg.category_id }}.html">全部</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">{{ row.caption }}</a>
{% else %}
<a href="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html">{{ 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">全部</a>
{% else %}
<a href="/cmdb/article-{{ article_arg.article_type_id }}-0.html">全部</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">{{ row.caption }}</a>
{% else %}
<a href="/cmdb/article-{{ article_arg.article_type_id }}-{{ row.id }}.html">{{ 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,参考博客Django基础篇

myfilter.py

#!/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">全部</a>
{% else %}
<a href="/cmdb/article-0-{{ article_arg.category_id }}.html">全部</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">{{ row.caption }}</a>
{% else %}
<a href="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html">{{ 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">全部</a>' % article_arg['category_id']
else:
res = '<a href="/cmdb/article-0-%s.html">全部</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">全部</a>' % article_arg['article_type_id']
else:
res = '<a href="/cmdb/article-%s-0.html">全部</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">{{ row.caption }}</a>
{% else %}
<a href="/cmdb/article-{{ row.id }}-{{ article_arg.category_id }}.html">{{ 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">%s</a>' %(row.id,article_arg['category_id'],row.caption)
else:
temp = '<a href="/cmdb/article-%s-%s.html">%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">{{ row.caption }}</a>
{% else %}
<a href="/cmdb/article-{{ article_arg.article_type_id }}-{{ row.id }}.html">{{ 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">%s</a>' %(article_arg['article_type_id'],row.id,row.caption)
else:
temp = '<a href="/cmdb/article-%s-%s.html">%s</a>' % (article_arg['article_type_id'],row.id,row.caption)
res.append(temp)
return mark_safe("".join(res))

html模板

{% 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定义

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.处理函数变化

###获取####
aritcle_type=models.Article.article_type#直接获取类的静态字段

3.simpletag相应改变

###由于我们传递的元祖,所以取值使用元祖方式
article_type[0]# 筛选条件id
article_type[1]# 筛选条件名称

Django实现组合搜索的更多相关文章

  1. Django之组合搜索组件(二)--另附simple_tag的创建使用方法

    这次的代码为Django之组合搜索组件(一)的改版,实现的结果和(一)相同,不同的是,这次运用simple_tag方式,使.html程序简化 所以现在就开始编程吧! 首先想使用simple_tag方法 ...

  2. python(Django之组合搜索、JSONP、XSS过滤 )

    一.组合搜索 二.jsonp 三.xss过滤 一.组合搜索 首先,我们在做一个门户网站的时候,前端肯定是要进行搜索的,但是如果搜索的类型比较多的话,怎么做才能一目了然的,这样就引出了组合搜索的这个案例 ...

  3. Django中组合搜索功能

    需求分析 很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,看个例子吧: 注意红框中的标识,我们可以根据URL来做组合搜索. video- ...

  4. Django学习---组合搜索组件

    组合搜索组件 我们都会写博客,写文章之后我们要给文章设置目录,设置类型.之后我们在浏览文章的时候就能够按类别进行精确定位到文章,那这个组合搜索我们应该怎么做呢? 首先我们先创建3张表,分别存放文章,文 ...

  5. Django之组合搜索组件(一)

    什么是组合搜索呢? 比如你想买车,但手里只有10万块!所以你只能在10万块的车里挑选,但你喜欢黑色,因为觉得很高端大气上档次,说白了就是装逼杠杠的!之后售车姐给你拿了个表表,你看到了低于10万块且颜色 ...

  6. Django实现组合搜索的方法示例

    目录 一.实现方法 二.基本原理 三.代码样例 方法1:纯模板语言实现 方法二:使用simpletag实现 四.其他变化 1.model定义 2.处理函数变化 3.simpletag相应改变   一. ...

  7. Django 之组合搜索

    现在很多网站都会有这样的组合搜索功能,其实质是几个模型之间组合对数据库进行查询,并将结果显示到页面上. 每一行都是一个模型,模型之间有着连表关系(一对多.多对多等) 模型设计 总共四个模型:分别为方向 ...

  8. Django实现瀑布流,组合搜索

    Django中组合搜索功能 需求分析 很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,看个例子吧: 注意红框中的标识,我们可以根据URL ...

  9. django实现瀑布流、组合搜索、阶梯评论、验证码

    django实现图片瀑布流布局 我们在一些图片网站上经常会看到,满屏都是图片,而且图片都大小不一,却可以按空间排列.默认一个div是占用一行,当想把div里的图片并排显示的时候,只能使用float属性 ...

随机推荐

  1. 从JVM字节码执行看重载和重写

    Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的 ...

  2. Head First设计模式之桥接模式

    一.定义 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. 主要解决:在多维可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活. 何时使 ...

  3. Netty对Protocol Buffer的支持(七)

    Netty对Protocol Buffer的支持(七) 一.简介 在上一篇博文中笔者已经介绍了google的Protocol Buffer的使用,那么本文笔者就开始介绍netty对Protocol B ...

  4. visual studio各种新建项目和新建项简介

    一.新建项目 二.新建项 用户控件和自定义控件的区别 1.WinForm中的用户控件继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Contr ...

  5. Android开发——使用高级的RecyclerView实现侧滑菜单删除功能(SwipeRecyclerView)

    使用之前,先简单介绍一下这个SwipeRecyclerView,这是严大(严振杰)基于RecyclerView的进行修改和封装的高级RecyclerView,其可以实现像QQ聊天界面的侧滑删除菜单,和 ...

  6. 史上最简单的js+css3实现时钟效果

    今天我看到百度搜索的时间那个效果不错,于是就产生了模仿一下的效果,不过为了节省时间,就随便布了下局,废话不多说,先看看效果吧,顺便把百度的效果也拿过来. 对比样子差了好多啊,但是基本功能都是实现了的, ...

  7. 申请的服务器安装tomcat后不能访问的问题

    新申请的阿里云服务器,操作系统是CentOS6.5,安装jdk1.8版本,用java -version命令可以查看jdk版本,安装正确会有版本显示.然后安装tomcat,tomcat安装后默认端口是8 ...

  8. 【数论】洛谷P1372又是毕业季

    题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业 ...

  9. windows错误处理

    在调用windows API时函数会首先对我们传入的参数进行校验,然后执行,如果出现什么情况导致函数执行出错,有的函数可以通过返回值来判断函数是否出错,比如对于返回句柄的函数如果返回NULL 或者IN ...

  10. python实现XSS过滤(BeautifulSoup和白名单处理)

    下面我做的莫名其妙的代码格式化是因为这个 --.-- 首先大致说一下XSS,就是在HTML里插入恶意的javascript代码,使得在该HTML加载时执行恶意代码,达到攻击的目的. 可能存在的地方呢, ...