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:
如果是在内存中的类型数据可以这样写
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # articletype_list = models.ArticleType.objects.all() #获取表ArticleType所有值 2 articletype_list = models.Article.type_choice #获取表ArticleType所有值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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))