{%comment%} 内容{%endcomment%}标签
代码:
def do_comment(parser,token):
nodelist=parser.parse(('endcomment,'))
#接收一个包含了需要分析的模板标签名的元组作为参数,返回一个django.temlate.NodeList,此时的nodelist是在{%comment%}和{%endcomment%}之间的所有节点列表,不包含其本身。
parser.delete_first_token()
#此时的分析器还没有清除{%endcomment%}标签,因此调用此方法来防止标签被处理两次
return CommentNode()
class CommentNode(template.Node):#此方法只是返回一个空字符串,导致{%comment%}和{%endcomment%}之间的内容被忽略
def render(self, context):
return ''
再如:
{%upper%} {%endupper%}标签(转换大小写)
def do_upper(parser, token):
nodelist = parser.parse(('endupper',))
parser.delete_first_token()
return UpperNode(nodelist)
class UpperNode(template.Node):
def __init__(self, nodelist):
self.nodelist = nodelist#此时将nodelist的值传到类似全局变量self.nodelist中方便下面使用
def render(self, context):
output = self.nodelist.render(context)#对节点列表中的每个Node简单的调用render()
return output.upper()
如果想更深的了解,可以查看比较复杂渲染示例django/template/defaulttags.py中的{%if%}、{%for%}、{%ifequal%}和{%ifchanged%}的代码。