【问题标题】:How do I access my own template variables from within a custom template tags template?如何从自定义模板标签模板中访问我自己的模板变量?
【发布时间】:2012-03-25 12:29:55
【问题描述】:

我正在使用 Django 构建网站。

我有一个看起来像这样的上下文处理器设置:

 TEMPLATE_CONTEXT_PROCESSORS = (
        ...

    "mysite.context_processors.mystandardvariables"
 )

这会添加一些我喜欢在模板中使用的标准变量,例如 SITE_NAME 和 SITE_ROOT。

我刚刚创建了我的第一个自定义模板标签,我发现我无法访问这些标准变量。

我没有收到任何错误,我的页面显示正常,只是我想要的变量不可用。

为了检查哪些变量可用,我已经使用了{% debug %}。

我的标签如下所示:

@register.inclusion_tag('search/search_snippet.html', takes_context = True)
def search(context):
    form = forms.SearchForm()
    return {'form': form }

标签的模板如下所示:

<form action="{{ SITE_ROOT }}search" method="post">
    {% csrf_token  %}
    <table>
        {{ form.as_table }}
    </table>
    <input type="submit" value="Submit">
</form>

我在主页中包含这样的搜索标签:

{% extends "base.html" %}
{% load search_tags %}

{% block content %}

{% search %}

{% endblock %}

【问题讨论】:

  • 您确定要查找的密钥不在context?
  • 谢谢,看起来他们是!我想我必须合并我的“表单”变量并返回“上下文”?
  • 不,您不必合并变量。您应该能够通过它们的键获取上下文中的变量,然后您的包含标签可以拾取并执行某些操作,例如context.get('SITE_NAME', None)
  • 是的,我可以,但这肯定意味着我的包含标签必须具有可用变量的“站点特定”知识?无论如何,感谢您迄今为止的帮助。
  • 不一定。 .get() 返回的 None 是如果它们的键不存在将返回的内容,因此如果您想在不同的项目中使用该模板标签,您可以这样做而不会在键不存在时引发运行时异常'不存在。

标签: python django django-templates


【解决方案1】:

为了回答我自己的问题,我想出了一种使用普通模板标签而不是包含标签来做我想做的事情的方法。

@register.tag
def search(parser, token):
    return SearchNode()

class SearchNode(template.Node):
    def render(self, context):
        return render_to_string('search/search_snippet.html', 
                                 { 'form' : forms.FindForm() }, context)

在这里,我将上下文传递给将我的模板呈现为字符串的函数。

我更愿意将它作为一个包含标签来实现,因为它看起来工作量更少,但我不知道如何让它工作。

如果有人知道如何使用包含标签进行此操作,请回答,我会将您的问题标记为正确答案。

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2014-03-04
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多