Python django中的模板标记

Python django中的模板标记,python,django,Python,Django,在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):

在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 ''
根据调用parser.parse()后函数
do_comment
中的一本书,解析器尚未“消费”
{%endcomment%}
标记,因此代码需要显式调用parser.delete_first_token()以防止该标记被处理两次。谁能解释一下这是什么意思。

django说:

调用parser.parse()后,解析器尚未“使用” {%endcomment%}标记,因此代码需要显式调用 parser.delete_first_token()

官方文档(django book使用)解释了为什么应该调用
解析器。首先删除\u令牌()
。但它并没有解释
为什么解析器还没有“使用”{%endcomment%}
。我想这就是让你困惑的地方

让我们以
标记为例

因为我们可以选择给
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)

别读这本书,它已经过时了。去看看为什么不把那条线去掉,看看会发生什么?