Django:标记外部块

Hel*_*nar 5 django django-templates

似乎'with'标签如果在块之外声明它不起作用:

{% extends 'base.html' %}
{% with my_var=1 %}

{% block test1 %}
{{my_var}}
{% endblock %}

{% block test2 %}
{{my_var}}
{% endblock %}

{% endwith %}
Run Code Online (Sandbox Code Playgroud)

上面的模板只显示任何内容,因为my_var未在这些块中传递.我怎么能克服这个?

Mic*_*ert 1

我通过使用 Tornado 和 Jinja2 来到 Django,并且由于无法设置变量而感到疯狂,这些变量(a)可以在模板(而不是视图)中定义,并且(b)可以在派生自的基本模板中使用。查看 django-libs 中的一小段四行代码,我能够构建出这样的效果良好的东西。以下是应出现在各个块中的标题字符串的示例。

settings.py——添加到模板(Django 1.10+)

TEMPLATES = {
   ...
   builtins = ['mysite...wherever...templatetags',]
}
Run Code Online (Sandbox Code Playgroud)

mysite.whereever.templatetags.py

from django import template
register = template.Library()

@register.simple_tag(takes_context=True)
def setvar(context, key, value):
    context.dicts[0][key] = value
    return ''
Run Code Online (Sandbox Code Playgroud)

基本.html

{% block settings %}
    {% comment %}
          Put this at the TOP of the template before 
          any blocks that use variables.
    {% endcomment %}
{% endblock settings %}

<html>
<head><title>{{title}}</title></head>
<body><h1>My Site: {{title}}</h1>
{% block body %}
{% endblock body %}
</body></html>
Run Code Online (Sandbox Code Playgroud)

menu.html——不在视图中设置“标题”的模板:

{% extends "base.html" %}
{% block settings %}
    {{ block.super }} {% comment %}optional{% endcomment %}
    {% setvar 'title' 'Menu' %}
{% endblock %}
{% block body %}
     <ul><li>Fish</li><li>Steak</li></ul>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

现在,标题将出现在 HTML 中的两个位置,即使它是在派生模板中定义的,但出现在顶部模板中。