美文网首页Python待用想法简友广场
Python(四十九)自定义过滤器及标签

Python(四十九)自定义过滤器及标签

作者: Lonelyroots | 来源:发表于2022-01-14 20:04 被阅读0次

    从2021年9月2日发文至今,Python系列(包括代码在内)共计92026个字、四十九篇!

    1. 关于自定义

    1.1. 什么是自定义:

    根据一定规则,自己定义出符合需求功能的.

    1.2. 自定义可以用在哪里:

    用在任何你有需求的地方。

    1.3. 为什么需要自定义:

    因为内置的满足不了我们的需求。

    1.4. 怎么做自定义:

    不同的东西有不同的定义规则。

    2. 文件路径配置

    templates存放模板的目录。
    templatetags存放自定义标签及过滤器的目录。(目录名只能取这个,不能更改)

    创建自定义方法文件common_extra.py:
    该文件夹common也需要在主路由的settings里面注册,如下图所示:

    3. 自定义过滤器

    先导入template这个模块,然后通过register = template.Library():生成一个注册器,这个变量名必须为register。

    自定义模板过滤器的文件common_extra.py代码:
    # 自定义过滤器及标签:一、自定义过滤器
    
    from django import template
    
    register = template.Library()       # 生成一个注册器,该变量名称不能更改,只能为register
    
    # 注册自定义过滤器方法一
    def my_upper(values):       # 一定要带至少一个参数
        return values.upper()
    
    register.filter(my_upper)
    # register.filter('up',my_upper)   # 可以给他取名字,调用时直接使用改的名字即可
    
    # 注册自定义过滤器方法二
    @register.filter        # 不想取名写法
    # @register.filter('up')      # 使用装饰器会自动调用该函数,想取名写法。
    def my_upper(values):
        return values.upper
    
    @register.filter
    def my_sort(values):
        return sorted(values)      # sorted有返回值,且不单单可以给列表排序;而sort方法只能给列表排序且是直接更改原列表,没有返回值
    
    @register.filter
    def multiplication(values,x):
        num =  values * x
        return num
    

    模板过滤器分析:{{ var|foo:"bar" }}:var:变量;foo:过滤器;bar:参数。

    自定义过滤器就是一个带有一个或两个参数的Python 函数:

    • (输入的)变量的值 —— 不一定是字符串形式。
    • 参数的值 —— 可以有一个初始值,或者完全不要这个参数。
    自定义模板过滤器的文件index.html代码:

    {% load common_extra %}:将自定义过滤器、标签所在的文件进行加载

    {% load common_extra %}     {# 将自定义过滤器、标签所在的文件进行加载 #}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>django</title>
    </head>
    <body>
    
    {# 自定义过滤器及标签:一、自定义过滤器 #}
    
    {{ name }}<br>
    内置过滤器:{{ name|upper }}<br>
    使用自定义过滤器:{{ name|upper }}<br>
    {#使用自定义取了别名的过滤器{{ name|up }}<br>#}
    
    {{ li2 }}<br>
    使用自定义过滤器:{{ li2|my_sort }}<br>
    
    {{ num1 }}<br>
    使用自定义过滤器:{{ num1|multiplication:1 }}<br>
    使用自定义过滤器:{{ num1|multiplication:'3,1,2,3' }}<br>
    
    </body>
    </html>
    
    分路由book的views.py代码:
    """三、模板过滤器"""
    from django.shortcuts import render
    import datetime
    str1 = 'I like django'
    tu1 = ('a','b','c','d')
    li1 = ['q','w','e',1,2,3]
    li2 = ['q','w','e','a','b','c']
    dic = {'a':1,'b':2,'c':3}
    
    def temp_1(request):
        return render(request,'book/index.html',context={
            'name':'python chenhong',
            'name1':'PYTHON CHENHONG',
            'age':20,
            'nn':None,
            'li1':li1,
            'li2':li2,
            'dic1':dic,
            'tu1':tu1,
            'str1':str1,
            'null':'',
            'num1':1,
            'num2':2,
            'now':datetime.datetime.now,
            'html':'<h2> this is H2 </h2>',
            'float':3.1415926,
            'gt':'&gt;',
            'format_time':'%Y年%m月%d日 %H:%M:%S',
        })
    
    分路由book的urls.py代码:
    from django.urls import path
    # 从同级目录下导入文件
    from . import views
    
    urlpatterns = [
        path('temp_1/',views.temp_1),
    ]
    
    主路由的urls.py代码:
    from django.contrib import admin
    from django.urls import path,re_path,include
    # 从同级目录下导入文件
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('book/',include('book.urls')),      # 给book app分配一个子路由,访问的是整个文件
    ]
    

    4. 自定义标签

    简单标签django.template.Library.simple_tag()
    包含标签django.template.Library.inclusion_tag()
    tag()方法有两个参数:

    1. 模板标记的名称 - 字符串。 如果省略,将使用编译函数的名称。
    2. 编译的函数 – 一个Python函数(不要把函数名写成字符串)与过滤器注册一样,也可以将其用作装饰器。
    自定义模板标签的文件common_extra.py代码:

    先导入template这个模块,然后通过register = template.Library():生成一个注册器,这个变量名必须为register。

    # 自定义过滤器及标签:二、自定义模板标签
    
    from django import template
    
    register = template.Library()       # 生成一个注册器,该变量名称不能更改,只能为register
    
    # 简单标签
    import datetime
    
    # 无参数情况——格式化时间
    @register.simple_tag
    def current_time():
        format_time = '%Y年%m月%d日 %H:%M:%S'
        return datetime.datetime.now().strftime(format_time)
    
    # 有参数情况——格式化时间
    @register.simple_tag
    def current_time1(format_time):
        return datetime.datetime.now().strftime(format_time)
    
    # 获取上下文数据
    @register.simple_tag(takes_context=True)        # takes_context这个值决定要不要获取视图函数里面的数据,如果要,则设为True,默认为None
    def current_time2(context):     # 获取视图函数里context里的参数
        ft = context.get('format_time')
        return datetime.datetime.now().strftime(ft)
    
    
    # 自定义包含标签
    # 无参数情况
    @register.inclusion_tag('book/include_tag.html')
    def show_data():
        li = ['墨染','追风','彭于晏','苏格拉底','北斗','小白']
        return {'values':li}
    
    # 有参数情况
    @register.inclusion_tag('book/include_tag.html')
    def show_data1(li):
        return {'values':li}
    
    # 上下文数据
    @register.inclusion_tag('book/include_tag.html',takes_context=True)
    def show_data2(context):
        tu1 = context.get('tu1')
        li1 = context.get('li1')
        return {'values':tu1,'li1':li1}
    
    自定义模板标签的文件index.html代码:

    {% load common_extra %}:将自定义过滤器、标签所在的文件进行加载

    {% load common_extra %}     {# 将自定义过滤器、标签所在的文件进行加载 #}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>django</title>
    </head>
    <body>
    
    {# 自定义过滤器及标签:二、自定义模板标签 #}
    
    {# 模板标签无参数,空格隔开写参数名称 #}
    {% current_time %}<br>
    
    {# 模板标签有参数,空格隔开写参数名称 #}
    {% current_time1 '%Y年%m月%d日 %H:%M:%S' %}<br>
    
    {# 通过上下文数据接收方法来渲染 #}
    {% current_time2 %}<br>
    
    
    {# 包含标签 #}
    {% show_data %}<br>
    
    {#这里只能放一个参数#}
    {% show_data1 tu1 %}<br>
    
    {#这里可以放多个参数,上下文数据处理#}
    {% show_data2 %}<br>
    
    </body>
    </html>
    
    分路由book的views.py代码:
    """
    三、模板过滤器
    自定义过滤器及标签:一、自定义模板过滤器;二、自定义模板标签
    """
    from django.shortcuts import render
    import datetime
    str1 = 'I like django'
    tu1 = ('a','b','c','d')
    li1 = ['q','w','e',1,2,3]
    li2 = ['q','w','e','a','b','c']
    dic = {'a':1,'b':2,'c':3}
    
    def temp_1(request):
        return render(request,'book/index.html',context={
            'name':'python chenhong',
            'name1':'PYTHON CHENHONG',
            'age':20,
            'nn':None,
            'li1':li1,
            'li2':li2,
            'dic1':dic,
            'tu1':tu1,
            'str1':str1,
            'null':'',
            'num1':1,
            'num2':2,
            'now':datetime.datetime.now,
            'html':'<h2> this is H2 </h2>',
            'float':3.1415926,
            'gt':'&gt;',
            'format_time':'%Y年%m月%d日 %H:%M:%S',
        })
    

    创建一个模板标签的上下文数据文件include_tag.html:


    模板标签的上下文数据文件include_tag.html代码:
    {# 自定义过滤器及标签:二、自定义模板标签 #}
    {# 包含标签 #}
    <ul>
        {% for i in values %}
            <li>{{ i }}</li>
        {% endfor %}
    </ul>
    
    <ul>
        {% for i in li1 %}
            <li>{{ i }}</li>
        {% endfor %}
    </ul>
    
    分路由book的urls.py代码:
    from django.urls import path
    # 从同级目录下导入文件
    from . import views
    
    urlpatterns = [
        path('temp_1/',views.temp_1),
    ]
    
    主路由的urls.py代码:
    from django.contrib import admin
    from django.urls import path,re_path,include
    # 从同级目录下导入文件
    from . import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('book/',include('book.urls')),      # 给book app分配一个子路由,访问的是整个文件
    ]
    

    文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!

    Editor:Lonelyroots

    相关文章

      网友评论

        本文标题:Python(四十九)自定义过滤器及标签

        本文链接:https://www.haomeiwen.com/subject/zmhzcrtx.html