2011-11-26 96 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 

保罗是我的项目应用程序,它的工作。