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)
models.py
1   # articletype_list = models.ArticleType.objects.all() #获取表ArticleType所有值
2     articletype_list = models.Article.type_choice #获取表ArticleType所有值
views.py
 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))
filter.py

 

posted @ 2018-07-18 14:14  Garrett0220  阅读(281)  评论(0编辑  收藏  举报
levels of contents