Django模板中两个块之间的变量上下文?

7
我有两个块调用相同的方法和相同的变量。我希望只调用一次该方法,但结果在块标记的范围之外。我尝试在父模板header.html中调用此方法,并使用with标签,但似乎没有任何作用。
这是布局:
{% extends "header.html" %}

{% load navigation_tags %}

{% block header %}
    {% get_section site=site as section %}
    {% include "foobar.html" with section=section %}
{% endblock header %}

{% block navigation %}
    <nav>
        <div class="container">
            {% get_section site=site as section %}
            {% navigation section.slug %}
        </div>
    </nav>
{% endblock navigation %}

navigation_tags.py

@register.assignment_tag
def get_parent_section(site):
    if site.id == settings.FOOBAR_SITE_ID:
        section = Section.objects.get(id=settings.FOOBAR_SECTION_ID)
    else:
        # This is also a section instance.
        return site.default_section

也许包括 get_section 的代码是个好主意。如果它不是一个昂贵的调用,那么做两次可能会更容易。 - Resley Rodrigues
@ResleyRodrigues 的问题已更新。 - Saša Kalaba
2
可能是因为你在 if 条件中没有返回任何内容吗? - Resley Rodrigues
4
既然是相同的模板,你能否在视图注入的上下文中包含section信息?请注意不要改变原意,让翻译更加通俗易懂。 - Fernando Cezar
这个模板必须是一个 view 的返回值。您可以像这样向模板注入上下文:https://docs.djangoproject.com/en/2.0/intro/tutorial03/#write-views-that-actually-do-something - Fernando Cezar
显示剩余2条评论
2个回答

2
正如2pacho在另一个回答中和Fernando Cezar在评论中提到的那样,在不同的部分之间共享值的最简单方法是在模板上下文中设置它。如果您正在使用render快捷函数,则可以将dict作为context参数传递以向模板的呈现上下文添加值。这将是添加它的好地方,也是最容易放置它的地方。
return render(request, 'template.html', {'section': get_parent_section(site)})

然而,如果由于某些原因,您无法将其包含在上下文中,则可以使用装饰器向函数添加记忆化,以便缓存计算结果并在使用相同参数调用时立即返回。您可以使用functools.lru_cache来实现这一点,或者如果您正在使用Python 2.x,则可以使用它的Django后端django.utils.lru_cache.lru_cache

@register.assignment_tag
@functools.lru_cache()
def get_parent_section(site):
    if site.id == settings.FOOBAR_SITE_ID:
        section = Section.objects.get(id=settings.FOOBAR_SECTION_ID)
    else:
        # This is also a section instance.
        return site.default_section

谢谢。我知道我可以在视图中设置它的上下文,但我想知道是否有一些我可以在模板级别上做的事情。这个方法很好用。 - Saša Kalaba
1
明白了。Django的模板被设计成功能有限,所以我发现解决方案通常是要寻找其他方法。 - JSTL

0

我不会在 .py 之外调用一个方法。考虑到这是使用 Jinja2 模板,它很强大,但后端的方式并不是这样。

在这种情况下,我建议您为模板生成上下文,并在那里使用这些变量。

只需将其添加到生成它的上下文中即可。

context['site_parent'] = get_parent_section(site)

认为Jinja2(html)必须尽可能简单,并且可以帮助您进行基本编码和节省时间(例如循环以打印完全相同的信息,或根据上下文显示和隐藏代码),但在渲染时尽可能保持简单。

如果您愿意,可以阅读官方django网站有关模板的信息 https://docs.djangoproject.com/en/2.0/topics/templates/

但从我的经验来看,我会将方法调用保留在views.py中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接