如果'with'标签在块之外声明为这样,它似乎不起作用:
{% extends 'base.html' %}
{% with my_var=1 %}
{% block test1 %}
{{my_var}}
{% endblock %}
{% block test2 %}
{{my_var}}
{% endblock %}
{% endwith %}
上面的模板没有显示任何内容,因为 my_var 没有在这些块中传递。我该如何克服呢?
如果'with'标签在块之外声明为这样,它似乎不起作用:
{% extends 'base.html' %}
{% with my_var=1 %}
{% block test1 %}
{{my_var}}
{% endblock %}
{% block test2 %}
{{my_var}}
{% endblock %}
{% endwith %}
上面的模板没有显示任何内容,因为 my_var 没有在这些块中传递。我该如何克服呢?
我是通过将 Tornado 与 Jinja2 一起使用而来到 Django 的,我因无法设置变量而发疯. 查看来自 django-libs 的一小段四行代码,我能够安装类似这样的东西,效果很好。这是应出现在各种块中的标题字符串的示例。
settings.py -- 添加到模板 (Django 1.10+)
TEMPLATES = {
...
builtins = ['mysite...wherever...templatetags',]
}
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 ''
base.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>
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 %}
现在标题将出现在 HTML 中的两个位置,即使它在派生模板中定义但出现在顶部模板中。