WEB框架Django进阶----组合搜索组件
需求:

1.创建django工程并配置
2.然后创建数据库
models.py
from django.db import models
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,"Linux"),
# (3,"OpenStack"),
# )
# article_type_id = models.IntegerField(choices=type_choice)
数据库新建完毕后, 添加一些数据便于后面测试效果
3.添加url
from django.contrib import admin
from django.urls import path,re_path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
re_path('article-(?P<article_type_id>\d+)-(?P<category_id>\d+)/', views.article),
]
4.views.py
from django.shortcuts import render
from app01 import models
def article(request,*args,**kwargs):
print(kwargs) # {'article_type_id': '2', 'category_id': '1'}
condition = {}
for k,v in kwargs.items():
kwargs[k] = int(v) #字符更换为数字
if v == "0":
pass
else:
condition[k]=v
articletype_list = models.ArticleType.objects.all() #获取表ArticleType所有值
category_list = models.Category.objects.all() #获取表Category所有值
article_list =models.Article.objects.filter(**condition)#获取对应的k的V的值
return render(request,"article.html",
{
"article_list":article_list,
"category_list":category_list,
"articletype_list":articletype_list,
"arg_dict":kwargs
}
)
5.模板文件article.html
利用当前打开的url为基准
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.content a{
display: inline-block;
padding: 3px 5px;
border: 1px solid cornflowerblue;
margin: 5px 5px;
}
.content a.active{
background-color: aquamarine;
}
</style>
</head>
<body>
<h1>过滤条件</h1>
<div class="content">
<div>
{% if arg_dict.article_type_id == 0 %}
<a class="active" href="/article-0-{{ arg_dict.category_id }}/">全部</a>
{% else %}
<a href="/article-0-{{ arg_dict.category_id }}/">全部</a>
{% endif %}
{% for row in articletype_list %}
{% if row.id == arg_dict.article_type_id %}
<a class="active" href="/article-{{ row.id }}-{{ arg_dict.category_id }}/">{{ row.caption }}</a>
{% else %}
<a href="/article-{{ row.id }}-{{ arg_dict.category_id }}/">{{ row.caption }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if arg_dict.category_id == 0 %}
<a class="active" href="/article-{{ arg_dict.article_type_id }}-0/">全部</a>
{% else %}
<a href="/article-{{ arg_dict.article_type_id }}-0/">全部</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 }}/">{{ row.caption }}</a>
{% else %}
<a href="/article-{{ arg_dict.article_type_id }}-{{ row.id }}/">{{ row.caption }}</a>
{% endif %}
{% endfor %}
</div>
</div>
<h1>文章列表</h1>
<div>
<ul>
{% for row in article_list %}
<li>{{ row.id }}-{{ row.title }}</li>
{% endfor %}
</ul>
</div>
</body>
</html>
这样写感觉代码重复
可以把模板文件写在一起
6.在app01中创建templatetags--->filter.py
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.simple_tag
def filter_all(arg_dict,k):
if k == "article_type_id":
n1 = arg_dict["article_type_id"]
n2 = arg_dict["category_id"]
if n1 == 0:
ret = '<a class="active" href="/article-0-%s/">全部</a>' % n2
else:
ret = '<a href="/article-0-%s/">全部</a>' % n2
else:
n2 = arg_dict["article_type_id"]
n1 = arg_dict["category_id"]
if n1 == 0:
ret = '<a class="active" href="/article-%s-0/">全部</a>' % n2
else:
ret = '<a href="/article-%s-0/">全部</a>' % n2
return mark_safe(ret)
@register.simple_tag
def filter_article(k,arg_dict,v):
ret = []
for row in k:
if v == "article_type_id":
n1 = arg_dict["article_type_id"]
n2 = arg_dict["category_id"]
if row.id == n1:
temp = '<a class="active" href="/article-%s-%s/">%s</a>' % (row.id, n2, row.caption)
else:
temp = '<a href="/article-%s-%s/">%s</a>' % (row.id, n2, row.caption)
else:
n2 = arg_dict["article_type_id"]
n1 = arg_dict["category_id"]
if row.id == n1:
temp = '<a class="active" href="/article-%s-%s/">%s</a>' % (n2, row.id, row.caption)
else:
temp = '<a href="/article-%s-%s/">%s</a>' % (n2, 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</title>
<style>
.content a{
display: inline-block;
padding: 3px 5px;
border: 1px solid cornflowerblue;
margin: 5px 5px;
}
.content a.active{
background-color: aquamarine;
}
</style>
</head>
<body>
<h1>过滤条件</h1>
<div class="content">
<div>
{% filter_all arg_dict "article_type_id" %}
{% filter_article articletype_list arg_dict "article_type_id" %}
</div>
<div>
{% filter_all arg_dict "category_id" %}
{% filter_article category_list arg_dict "category_id" %}
</div>
</div>
<h1>文章列表</h1>
<div>
<ul>
{% for row in article_list %}
<li>{{ row.id }}-{{ row.title }}</li>
{% endfor %}
</ul>
</div>
</body>
</html>
这样就可以实现需求的组合搜索组件
PS:
如果是在内存中的类型数据可以这样写
1 from django.db import models 2 3 class Category(models.Model): #文章级别表 4 caption = models.CharField(max_length=16) 5 6 # class ArticleType(models.Model): #文章类型表 7 # caption = models.CharField(max_length=16) 8 9 class Article(models.Model): # 文章表 10 title = models.CharField(max_length=32) 11 content = models.CharField(max_length=255) 12 13 category = models.ForeignKey(Category,on_delete=None) 14 article_type = models.ForeignKey(ArticleType,on_delete=None) 15 16 # 文章类型写在内存中 17 type_choice = ( 18 (1,"Python"), 19 (2,"Linux"), 20 (3,"OpenStack"), 21 ) 22 article_type_id = models.IntegerField(choices=type_choice)
1 # articletype_list = models.ArticleType.objects.all() #获取表ArticleType所有值 2 articletype_list = models.Article.type_choice #获取表ArticleType所有值
1 from django import template 2 from django.utils.safestring import mark_safe 3 4 register = template.Library() 5 6 @register.simple_tag 7 def filter_all(arg_dict,k): 8 9 if k == "article_type_id": 10 n1 = arg_dict["article_type_id"] 11 n2 = arg_dict["category_id"] 12 if n1 == 0: 13 ret = '<a class="active" href="/article-0-%s/">全部</a>' % n2 14 else: 15 ret = '<a href="/article-0-%s/">全部</a>' % n2 16 17 else: 18 n2 = arg_dict["article_type_id"] 19 n1 = arg_dict["category_id"] 20 if n1 == 0: 21 ret = '<a class="active" href="/article-%s-0/">全部</a>' % n2 22 else: 23 ret = '<a href="/article-%s-0/">全部</a>' % n2 24 25 return mark_safe(ret) 26 27 28 @register.simple_tag 29 def filter_article(k,arg_dict,v): 30 ret = [] 31 for row in k: 32 if v == "article_type_id": 33 n1 = arg_dict["article_type_id"] 34 n2 = arg_dict["category_id"] 35 if row[0] == n1: 36 temp = '<a class="active" href="/article-%s-%s/">%s</a>' % (row[0], n2, row[1]) 37 else: 38 temp = '<a href="/article-%s-%s/">%s</a>' % (row[0], n2, row[1]) 39 else: 40 n2 = arg_dict["article_type_id"] 41 n1 = arg_dict["category_id"] 42 if row.id == n1: 43 temp = '<a class="active" href="/article-%s-%s/">%s</a>' % (n2, row[0], row[1]) 44 else: 45 temp = '<a href="/article-%s-%s/">%s</a>' % (n2, row[0], row[1]) 46 ret.append(temp) 47 return mark_safe("".join(ret))
浙公网安备 33010602011771号