在第9章关于高级模板的djangobook中,它显示了{% 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 ''
根据调用parser.parse()之后函数do_comment
中的书,解析器尚未“消耗”{% endcomment %}
标记,因此代码需要显式调用解析器。 delete_first_token()以防止该标记被处理两次。任何人都可以解释这是什么意思。
答案 0 :(得分:2)
django doc说:
在调用parser.parse()之后,解析器还没有“消耗”了 {%endcomment%}标记,因此代码需要显式调用 parser.delete_first_token()。
官方文档(由django书使用)解释了应该调用parser.delete_first_token()
的原因。但它没有解释why he parser hasn’t yet “consumed” the {% 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)