2014-01-15 149 views
2

在先进的模板第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 '' 

根据书在功能do_comment parser.parse后()被调用时,分析器还没有“消费”的{% endcomment %}标签,因此代码需要显式调用parser.delete_first_token()来防止该标签被处理两次。任何人都可以请解释这是什么意思。

+3

不读取djangobook,它已过时。去https://docs.djangoproject.com/en/1.6/ – laike9m

+1

你为什么不只是删除了这一行,看看会发生什么? –

回答

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) 
+0

非常好的回答:) –