django模板标签实例

时间:2011-11-26 07:18:32

标签: python django django-templates

很难说出问题所以生病了,我写下了以下模板标签

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的一个实例(或者我相信),isinstance会失败,我检查nodelist并看到确实有SimpleTagNode的实例,但它们都会返回在isinstance条件下假,我已经花了很长时间试图找出这个,但没有发现任何东西,我甚至使用了运行上面功能的shell并仍然返回了fals,任何帮助都非常值得赞赏

1 个答案:

答案 0 :(得分:1)

所以我终于解决了它,基本上在文件顶部包含_scan_tag函数的模块中,我正在导入SimpleTagNode类,如此

from simple_tag.templatetags.simple_tag import SimpleTagNode

simple_tag是我的应用的名称,也是模板文件的名称,由于某种原因这与isinstance有冲突,所以我试过

from paulo.simple_tag.templatetags.simple_tag import SimpleTagNode

paulo是我的项目应用程序,它有效。