http://120ni.51niux.com/post/31.html
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>
测试一下:












