2011-11-26 78 views
1

難字的問題如此虐待向右走的時候,我寫了下面的模板標籤Django的模板標籤實例

def do_simple_tag(parser, token): 
    try: 
     tag_name, name = token.split_contents() 
    except ValueError: 
     raise template.TemplateSyntaxError("%r tag requires exactly one argument" % token.contents.split()[0]) 
    if not (name[0] == name[-1] and name[0] in ('"', "'")): 
     raise template.TemplateSyntaxError("%r tag's argument should be in quotes" % tag_name) 
    return SimpleTagNode(name[1:-1]) 


class SimpleTagNode(template.Node): 
    def __init__(self, name): 
     self.name = name 
    def render(self, context): 
     content = get_content(context, request, name) 
     return content 

register.tag('simple_tag', do_simple_tag) 

然後我寫了掃描模板中的這個標籤,並得到所有實例的功能此標記表示內模板列表中,像這樣

def get_tags(template): 
    compiled_template = get_template(template) 
    simple_tag_instances = _scan_tag(compiled_template.nodelist) 

def _scan_tag(nodelist, current_block=None, ignore_blocks=[]): 
    tags = [] 
    for node in nodelist: 
     if isinstance(node, SimpleTagNode): 
      tags.append(node.get_name()) 

所以,我的問題是爲什麼,如果節點是SimpleTagNode的INFACT實例(或因此我認爲)請問isinstance失敗,我檢查nodelist,發現確實有SimpleTagNode的實例,但他們會a在isinstance條件下返回false,我花了很長時間試圖找出這一個,但沒有發現任何東西,我甚至使用殼運行上面的功能,仍然返回的錯誤,任何幫助是非常讚賞

+1

首先,你確定在Django的上下文中,節點是你認爲它的實例嗎?嘗試添加'import pdb; pdb.set_trace()'在迭代nodelist之前。調試外殼將在Django dev服務器中打開,您將可以執行類型(節點)。 –

+0

我照你說的做了,並嘗試了isinstance(nodelist [2],SimpleTagNode),並且它返回了true,但是當我讓它正常運行時它返回False – Paulo

回答

1

所以我終於解決了這個問題,即在文件的頂部包含_scan_tag功能我是導入SimpleTagNode類,像這樣

from simple_tag.templatetags.simple_tag import SimpleTagNode 

simple_tag是我的應用程序的名稱,該模塊基本上,也是模板的名稱文件,由於某種原因,這與isinstance衝突,所以我試圖

from paulo.simple_tag.templatetags.simple_tag import SimpleTagNode 

保羅是我的項目應用程序,它的工作。