zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    YAR 并行RPC框架研究
    Yar
    Monolog
    laravel controller:make
    eclipse自动补全的设置(自动提示)
    如何在 PHP 中处理 Protocol Buffers 数据
    JAVA printWriter中write()和println()区别
    eclipse中启动tomcat
    Ajax简介
    div
  • 原文地址:https://www.cnblogs.com/garrett0220/p/9328895.html
Copyright © 2011-2022 走看看