Django之组合搜索组件(一)
什么是组合搜索呢?
比如你想买车,但手里只有10万块!所以你只能在10万块的车里挑选,但你喜欢黑色,因为觉得很高端大气上档次,说白了就是装逼杠杠的!之后售车姐给你拿了个表表,你看到了低于10万块且颜色为黑的各种车!其实这就是组合搜索!
那运用Django框架,该程序怎么实现呢?
那就先看看程序吧!
urls.py from app01 import views from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.conf.urls import url from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), url(r'^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html',views.article), #定义模板的名字 ]
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(to='Category',to_field='id',on_delete=models.CASCADE) #文章分类 article_type = models.ForeignKey(to='ArticleType',to_field='id',on_delete=models.CASCADE) #文章类型 # type_choice = ( #可以替换上面的class ArticleType(models.Model) # (1,'Python'), # (2,'OpenStack'), # (3,'Linux'), # ) # article_type_id = models.IntegerField(choices=type_choice) #相当于把表type_choice放到内存里
views.py from django.shortcuts import render from app01 import models def article(request,*args,**kwargs): #可以取任意数 print(kwargs) # kwargs=={'article_type_id': 'v', 'category_id': 'v'} 里面传递了两个参数 condition = {} #创建一个空的字典 for k,v in kwargs.items(): #{'article_type_id': 'v', 'category_id': 'v'} k为article_type_id、category_id kwargs[k] = int(v) if v == '0': #如果字典中的值(value)为0时 {'article_type_id': '0', 'category_id': '0'} pass else: #不为0时 condition[k] = v # 把v放入到k中 #{'article_type_id': 'v', 'category_id': 'v'} k为article_type_id、category_id # article_type_list = models.ArticleType.objects.all() article_type_list = models.ArticleType.objects.all() #文章技术语言类列表 category_list = models.Category.objects.all() #分类 result = models.Article.objects.filter(**condition) #按condition内容里的条件进行查找 {'article_type_id': 'v', 'category_id': 'v'} return render( request, 'article.html', { 'result': result, 'article_type_list': article_type_list, 'category_list': category_list,
'arg_dict': kwargs
} )
# Create your views here.
<!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> {% if arg_dict.article_type_id == 0 %} <a class="active" href="http://127.0.0.1:8000/article-0-{{ arg_dict.category_id}}.html">全部</a> {% else %} <a href="http://127.0.0.1:8000/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="http://127.0.0.1:8000/article-{{ row.id }}-{{ arg_dict.category_id}}.html">{{ row.caption }}</a> {% else %} <a href="http://127.0.0.1:8000/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="http://127.0.0.1:8000/article-{{ arg_dict.article_type_id}}-0.html">全部</a> {% else %} <a href="http://127.0.0.1:8000/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="http://127.0.0.1:8000/article-{{ arg_dict.article_type_id }}-{{ row.id}}.html">{{ row.caption }}</a> {% else %} <a href="http://127.0.0.1:8000/article-{{ arg_dict.article_type_id }}-{{ row.id }}.html">{{ row.caption }}</a> {% endif %} {% endfor %} </div> <h1>查询结果</h1> <ul> {% for row in result %} <li>{{ row.id }}-{{ row.title }}</li> {% endfor %} </ul> </body> </html>
数据库的表
Article
ArticleType
Category
前端主页: