Skip to main content
 首页 » 编程设计

python之django 中的模板标签

2024年11月01日28emanlee

在 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)