在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说:


  调用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)

关于python - Django中的模板标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21128206/

10-12 23:03