2014-01-15 55 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

非常好的回答:) –