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

前端主页:

原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/9159661.html