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

目录

一、实现方法

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{

      

    }

  </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">

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

原文地址:https://www.cnblogs.com/AmilyWilly/p/8537484.html

时间: 2024-11-11 01:50:15

Django实现组合搜索的方法示例的相关文章

Django 之组合搜索

现在很多网站都会有这样的组合搜索功能,其实质是几个模型之间组合对数据库进行查询,并将结果显示到页面上. 每一行都是一个模型,模型之间有着连表关系(一对多.多对多等) 模型设计 总共四个模型:分别为方向.分类.等级以及存储结果信息 一个方向下可以有多个分类,一个分类也可以是多个方向(多对多) 一个分类可以有多个视频(一对多) 一个等级下也可以有多个视频(一对多) from django.db import models class Direction(models.Model): ""&

Django实现组合搜索

一.实现方法 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和数据库中字段是

stark组件开发之组合搜索页面效果和 URL

页面效果,只是样式.这个好解决!yield 的时候. 返回几个样式出去就好了! 并且前端写上一些样式的css {% if search_group_row_list %} <div class="panel panel-default"> <div class="panel-heading"> <i class="fa fa-filter" aria-hidden="true"></i

django meta 类的使用方法

通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(models.Model):     bar = models.CharField(maxlength=30) class Meta:         # ... Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项, admin 选项等等. 下面是所有可能用到的 Meta 选项. 没有一个选项是必需的. 是否添加 class Meta

问答项目---栏目增删改方法示例

具体方法: // 递归重新排序无限极子分类数组 function recursive($array,$pid=0,$level=0){ $arr = array(); foreach ($array as $v) { if($v['pid'] == $pid){ $v['level'] = $level; $v['html'] = str_repeat('--',$level); $arr[] = $v; $arr = array_merge($arr,recursive($array,$v['

sharepoint 2013 使用SharePoint powershell 2013更改搜索服务器方法

$hostA = Get-SPEnterpriseSearchServiceInstance -Identity "DevSearch2013" Start-SPEnterpriseSearchServiceInstance -Identity $hostA Get-SPEnterpriseSearchServiceInstance -Identity $hostA $ssa = Get-SPEnterpriseSearchServiceApplication $newTopology

jQ的toggle()方法示例

定义和用法toggle() 方法切换元素的可见状态.如果被选元素可见,则隐藏这些元素,如果被选元素隐藏,则显示这些元素. 语法$(selector).toggle(speed,callback,switch) 参数: speed 可选.规定元素从可见到隐藏的速度(或者相反).默认为 "0".可能的值:毫秒 (比如 1500)"slow""normal""fast"在设置速度的情况下,元素从可见到隐藏的过程中,会逐渐地改变其高度

tornado的GET POST方法示例

例子说明get和post的方法使用: 一.示例用的GET方法: import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") application = tornado.web.Application([ (r"/", MainHandler), ]) if __name

Android播放动画的方法示例

今天开始陆续整理一下一些常规的Android常用开发实用程序. 第一季:Android播放动画的方法示例 1. 通常动画都是gif图像,推荐使用easygifanimator工具来将其拆解为多个图片,建议是png的: 2. 在Android工程的res目录下新增anim目录,新建一个xml文件,比如loading.xml: <?xml version="1.0" encoding="utf-8"?> <animation-list android: