2014-01-15 2 views
2

В djangobook в главе 9 на расширенных шаблонах показано, как реализован тег {% comment %}.Теги шаблона в django

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

Джанго 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

очень хороший ответ :) –

Смежные вопросы