Django自定义模板过滤器和标签

#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)