Django之组合查找功能(十七)
通过Django实现类似于如下的组合查找功能:
一、实现方式一
1.1 先试着拿到所有的内容
models.py :
from django.db import models # Create your models here. # 创建一个标签表 class Category(models.Model): caption = models.CharField(max_length=16) #文章类型分类表动态的就要搞表 class ArticleType(models.Model): caption = models.CharField(max_length=16) #创建一个标题和内容表 class Article(models.Model): title = models.CharField(max_length=32) content = models.CharField(max_length=255) # 建立外键约束 category = models.ForeignKey(Category,on_delete=None) article_type = models.ForeignKey(ArticleType,on_delete=None) # type_choice = ( #如果是静态的就存放到内存里面 # (1,'Python'), # (2,'OpenStack'), # (3,'Linux'), # ) # article_type_id = models.IntegerField(choices=type_choice)
python manage.py makemigrations
python manage.py migrate
#上面是往类型表里面插入点数据,一般类型就定死了很少变了。
#上面是往分类表里面插入点数据,想写什么就写什么。
#在内容表里面插入点内容。
urls.py :
url(r'^article/', views.article),
views.py:
from django.shortcuts import render from app01 import models def article(request): result = models.Article.objects.all() return render(request,'article.html',{'result':result})
article.html:
<body> <h1>查询结果</h1> <ul> {% for row in result %} <li>{{ row.id }}-{{ row.title }}</li> {% endfor %} </ul> </body>
测试一下:
#这就把数据库里面所有的文章标题都拿到了。
1.2 多显示一点把分类什么的都打印出来
views.py:
from django.shortcuts import render from app01 import models def article(request,*args,**kwargs): article_type_list = models.ArticleType.objects.all() category_list = models.Category.objects.all() result = models.Article.objects.all() return render( request, 'article.html', { 'result':result, 'article_type_list':article_type_list, 'category_list':category_list })
article.html:
<body> <h1>过滤条件</h1> <div> {% for row in article_type_list %} <a>{{ row.caption }}</a> {% endfor %} </div> <div> {% for row in category_list %} <a>{{ row.caption }}</a> {% endfor %} </div> <h1>查询结果</h1> <ul> {% for row in result %} <li>{{ row.id }}-{{ row.title }}</li> {% endfor %} </ul> </body>
测试一下:
1.3 通过跳转不同的url实现组合过滤
urls.py :
url(r'^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html', views.article),
views.py :
from django.shortcuts import render # Create your views here. from app01 import models from django.urls import reverse def article(request,*args,**kwargs): print(kwargs) condition = {} for k,v in kwargs.items(): kwargs[k] = int(v) if v == '0': pass else: condition[k] = v article_type_list = models.ArticleType.objects.all() category_list = models.Category.objects.all() result = models.Article.objects.filter(**condition) return render( request, 'article.html', { 'result':result, 'article_type_list':article_type_list, 'category_list':category_list, 'arg_dict':kwargs })
article.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .condition a{ display: inline-block; padding: 3px 5px; border: 1px solid #dddddd; margin: 5px ; } .condition a.active{ background-color: brown; } </style> </head> <body> <h1>过滤条件</h1> <div class="condition"> <div> {% if arg_dict.article_type_id == 0 %} <a class="active" href="/article-0-{{ arg_dict.category_id }}.html">全部</a> {% else %} <a href="/article-0-{{ arg_dict.category_id }}.html">全部</a> {% endif %} {% for row in article_type_list %} {% if row.id == arg_dict.article_type_id %} <a class="active" href="/article-{{ row.id }}-{{ arg_dict.category_id }}.html">{{ row.caption }}</a> {% else %} <a href="/article-{{ row.id }}-{{ arg_dict.category_id }}.html">{{ row.caption }}</a> {% endif %} {% endfor %} </div> <div> {% if arg_dict.category_id == 0 %} <a class="active" href="/article-{{ arg_dict.article_type_id }}-0.html">全部</a> {% else %} <a href="/article-{{ arg_dict.article_type_id }}-0.html">全部</a> {% endif %} {% for row in category_list %} {% if row.id == arg_dict.category_id %} <a class="active" href="/article-{{ arg_dict.article_type_id }}-{{ row.id }}.html">{{ row.caption }}</a> {% else %} <a href="/article-{{ arg_dict.article_type_id }}-{{ row.id }}.html">{{ row.caption }}</a> {% endif %} {% endfor %} </div> </div> <h1>查询结果</h1> <ul> {% for row in result %} <li>{{ row.id }}-{{ row.title }}</li> {% endfor %} </ul> </body> </html>
测试一下:
#默认的url就是http://127.0.0.1:8000/article-0-0.html,这样就是显示全部信息。
#从上图可以看到内容已经发生了改变。
#可以看到组合筛选生效了。
二、实现方式二
方式一的代码中前端页面中有太多的判断,导致前端页面看起来比较杂乱,下面我们通过之前学习过的simple_tag的方式实现。
通过函数实现:app01/templatetags/filter.py:
from django import template from django.utils.safestring import mark_safe # 通过这个模块可以将html添加到前端页面 register = template.Library() # 用户注册 @register.simple_tag def filter_all(arg_dict, k): ''' :param arg_dict: :param k: 用于判断输入的是article_type_id还是category_id :return: ''' if k == "article_type_id": n1 = arg_dict[k] n2 = arg_dict["category_id"] if n1 == 0: ret = '<a class="active" href="/article-0-%s.html">全部</a>' % n2 else: ret = '<a href="/article-0-%s.html">全部</a>' % n2 else: n1 = arg_dict[k] n2 = arg_dict["article_type_id"] if n1 == 0: ret = '<a class="active" href="/article-%s-0.html">全部</a>' % n2 else: ret = '<a href="/article-%s-0.html">全部</a>' % n2 return mark_safe(ret) @register.simple_tag def filter_article_type(article_type_list, arg_dict): ''' :param article_type_list: :param arg_dict: :return: ''' ret = [] for row in article_type_list: if row.id == arg_dict["article_type_id"]: temp = '<a class="active" href="/article-%s-%s.html">%s</a>' % (row.id, arg_dict["category_id"], row.caption) else: temp = '<a href="/article-%s-%s.html">%s</a>' % (row.id, arg_dict["category_id"], row.caption) ret.append(temp) return mark_safe("".join(ret)) @register.simple_tag def filter_category(category_list, arg_dict): ret = [] for row in category_list: if row.id == arg_dict["category_id"]: temp = '<a class="active" href="/article-%s-%s.html">%s</a>' % (arg_dict["article_type_id"], row.id, row.caption) else: temp = '<a href="/article-%s-%s.html">%s</a>' % (arg_dict["article_type_id"], row.id, row.caption) ret.append(temp) return mark_safe("".join(ret))
article.html :
{% load filter %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .condition a{ display: inline-block; padding: 3px 5px; border: 1px solid #dddddd; margin: 5px ; } .condition a.active{ background-color: brown; } </style> </head> <body> <h1>过滤条件</h1> <div class="condition"> <div> {% filter_all arg_dict 'article_type_id' %} {% filter_article_type article_type_list arg_dict %} </div> <div> {% filter_all arg_dict 'category_id' %} {% for row in category_list %} {% if row.id == arg_dict.category_id %} <a class="active" href="/article-{{ arg_dict.article_type_id }}-{{ row.id }}.html">{{ row.caption }}</a> {% else %} <a href="/article-{{ arg_dict.article_type_id }}-{{ row.id }}.html">{{ row.caption }}</a> {% endif %} {% endfor %} </div> </div> <h1>查询结果</h1> <ul> {% for row in result %} <li>{{ row.id }}-{{ row.title }}</li> {% endfor %} </ul> </body> </html>
测试一下: