自定义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应用开发实战笔记
努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。