#coding=utf8
'''自定义模板标签过滤器及标签'''
from django import template
import datetime
import re #正则匹配相关的库
register=template.Library() #用来注册自定义的过滤器
@register.filter
def Mylower(value):
'''自定义过滤器:大写转小写,value为变量名,arg为变量值'''
return value.lower()
#自定义标签
#第一步编写编译函数
@register.tag(name='current_time')
def do_current_time(parser,token):
try:
tag_name,format_str=token.split_contents()
except ValueError:
error_msg='%s tag requires single argument' % token.split_contents()[0]
raise template.TemplateSyntaxError(error_msg)
return CurrentTimeNode(format_str[1:-1])
#第二步编写节点
class CurrentTimeNode(template.Node):
def __init__(self,format_str):
self.format_str=format_str
def render(self, context):
now=datetime.datetime.now()
return now.strftime(self.format_str)
#自定义标签,带上下文变量
@register.tag(name='current_time2')
def do_current_time2(parser,token):
try:
tag_name,arg=token.contents.split(None,1) #None代表空格,按空格切割,仅切割一次
except ValueError:
error_msg='%s tag requires arguments' % token.split_contents()[0]
raise template.TemplateSyntaxError(error_msg)
m=re.search(r'(.*?) as (\w+)',arg)
if m:
format_str,var_name=m.groups()
else:
error_msg='%s tag had invalid arguments' % tag_name
raise template.TemplateSyntaxError(error_msg)
if not (format_str[0]==format_str[-1] and format_str[0] in ['"',"'"]):
error_msg="%s tag's format_argument should in quotes" % tag_name
raise template.TemplateSyntaxError(error_msg)
return CurrentTimeNode2(format_str,var_name)
class CurrentTimeNode2(template.Node):
def __init__(self,format_str,var_name):
self.format_str=format_str
self.var_name=var_name
def render(self, context):
now=datetime.datetime.now()
context[self.var_name]=now.strftime(self.format_str)
return ''
Django自定义模板过滤器和标签
最新推荐文章于 2024-07-25 20:57:40 发布