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

从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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348