在 djangobook 的第 9 章高级模板中,它显示了 {% comment %} 标签是如何实现的。
def do_comment(parser, token):
nodelist = parser.parse(('endcomment',))
parser.delete_first_token()
return CommentNode()
class CommentNode(template.Node):
def render(self, context):
return ''
根据本书在函数 do_comment 中调用 parser.parse() 之后,解析器还没有“消耗” {% endcomment %} 标签,因此代码需要显式调用 parser.delete_first_token() 以防止该标记被处理两次。谁能解释一下这是什么意思。
请您参考如下方法:
django doc说:
After parser.parse() is called, the parser hasn’t yet “consumed” the {% endcomment %} tag, so the code needs to explicitly call parser.delete_first_token().
官方文档(django book 使用)解释了为什么要调用 parser.delete_first_token()。但这并没有解释为什么他的解析器还没有“消费”{% endcomment %}。我想这就是让您感到困惑的原因。
我们以block标签为例。
因为我们可以选择给 endblock 标签节点一个名字,我们需要检查这个名字是否与 block 标签节点中定义的名字相匹配。
所以对于大多数情况,我们可以简单地忽略endxxx标签节点,但在某些情况下,我们需要获取最后一个标签节点并做额外的事情。
@register.tag('block')
def do_block(parser, token):
...
nodelist = parser.parse(('endblock',))
# This check is kept for backwards-compatibility. See #3100.
endblock = parser.next_token()
acceptable_endblocks = ('endblock', 'endblock %s' % block_name)
if endblock.contents not in acceptable_endblocks:
parser.invalid_block_tag(endblock, 'endblock', acceptable_endblocks)
return BlockNode(block_name, nodelist)
