Django 变量直接替换在模板中,但不在自定义标签中

Posted

技术标签:

【中文标题】Django 变量直接替换在模板中,但不在自定义标签中【英文标题】:Django variable substituted in template directly but not in custom tag 【发布时间】:2015-09-09 08:01:20 【问题描述】:

我创建了一个自定义标签,其工作方式类似于块标签:

@register.tag
def dash(parser, token):
    nodelist = parser.parse(('enddash',))
    parser.delete_first_token()
    args = token.split_contents()

    title = args[1]

    return DashNode(nodelist, title)


class DashNode(template.Node):
    def __init__(self, nodelist, title):
        self.nodelist = nodelist

        if title[0] in ('"', "'") and title[0] == title[-1]:
            self.title = title[1:-1]
        else:
            self.title = template.Variable(title)

        self.tpl = """
<div class="dashboard-body container-fluid main-section-body view-mode" data-role="main">
    <div class="dashboard-header clearfix">
        <h2>title</h2>
    </div>
content
</div>"""

    def render(self, context):
        try:
            title = self.title.resolve(context)
        except AttributeError:
            title = self.title

        output = self.nodelist.render(context)

        new_output = self.tpl.format(content=output, title=title)
        return new_output

标签接受参数,可以是字符串或变量。我在the official documentation 之后创建了它。

标签与字符串一起工作没有问题。如果我使用变量:

% dash page_title %
   <!-- blablabla -->
% enddash %

出现VariableDoesNotExist 错误。但是如果我直接在模板中使用它,该变量会正确扩展。

我正在使用 Django 1.5.5(我被它锁定了......)

【问题讨论】:

【参考方案1】:

VariableDoesNotExist 在self.title.resolve(context) 行中抛出,因为在实例化template.Variable(title) 时,标题与当前context 中的现有变量不对应。这可能意味着在您的示例中title 不是"page_title"。检查。

【讨论】:

titlepage_title【参考方案2】:

现在看来可以了。我根本没有改变我的代码。这可能是由我正在使用的框架(Splunk)引起的。

【讨论】:

以上是关于Django 变量直接替换在模板中,但不在自定义标签中的主要内容,如果未能解决你的问题,请参考以下文章

Django(自定义过滤器和自定义标签)

Django自定义simple_tag和filter

Django基础四之模板系统

Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?

django 编写我的第一个自定义模板标签和过滤器

如何用自定义变量替换 DJANGO 中 JAVASCRIPT 脚本生成的 Google Map Key