自定义Django过滤器和标签

在项目的根目录下创建新的文件夹(与manage.py同级,也就是想当个应用),文件夹名称可自行命名,然后再该文件夹下创建初始化文件__init__.py和templatestags文件夹,templatestags文件夹下创建初始化文件__init__.py文件和自定义标签文件myfilter.py。其中templatestags文件夹文件夹名称是固定不变的。init.py文件中并不需要编写代码。

配置

将创建的新文件夹名称加到settings.py的属性INSTALLED_APPS里添加该文件名称。

编写过滤器

在myfilter.py文件中编写实现模板上下文的字符替换

from django import template
# 创建模版对象
register = template.Library()
# 声明并定义过滤器
@register.filter(name='replace') # 对函数do_replace()由装饰器@register.filterl处理,并对其进行注册操作
def do_replace(value, agrs):# value代表当前过滤器的模板上下文
    oldValue = agrs.split(':')[0] # args代表过滤器器的参数,函数将过滤器agrs以冒号分隔,用于参数value进行字符串替换操作
    newValue = agrs.split(':')[1]
    return value.replace(oldValue, newValue) # 将处理结果返回

自定义标签

标签的配置和过滤器的配置一样

编写自定义标签

实现标签里的数据进行反转

from django import template
# 创建模版对象
register = template.Library()

# 这个函数实现的思路值得考虑,类传进来的对象是经过下一个函数处理的
# 定义模版节点类
class ReversalNode(template.Node):
    def __init__(self, value):
        self.value = str(value)

    # 数据反转处理
    def render(self, context):
        return self.value[::-1]

# 声明并定义标签
'''
标签名称由装饰器参数name进行命名,如果没有设置参数name就以函数名作为标签名称

'''
@register.tag(name='reversal')
# parse是解析器对象,token是被解析的对象
def do_reversal(parse, token):
    '''
    函数参数parse是解析器对象,当Django运行时,他将所有标签和过滤器进行加载并生成到parse对象
    在解析模板文件里面的标签时,Django就会从parse对象查找对应的标签信息

    函数参数token时模板文件使用标签时所传递的数据对象,主要包括标签名和数据内容
    do_reversal对参数token使用split_contents()方法(Django内置方法)进行取值处理,从中获取数据value,并将value传递给
    自定义模板节点类ReversalNode
    '''
    try:
        # tag_name是代表标签名,即reversal
        # value是由标签传递的数据
        tag_name, value = token.split_contents() # 在index.html中传进来的字符串就是这里的token;
        # 然后再把它传给value,再把value传给上面的函数类并返回
    except:
        raise template.TemplateSyntaxError('syntax')
    # 调用自定义的模板节点类
    return ReversalNode(value) #ReversalNode类是将value执行字符串反转处理,并生成模板节点对象,用于模板引擎解析HTML语言

来自Django Web应用开发实战笔记

posted @ 2021-09-25 17:21  索匣  阅读(52)  评论(0编辑  收藏  举报