Django:标记外部块

时间:2013-07-15 18:50:25

标签: django django-templates

似乎'与'如果在块之外声明它,则该标记不起作用:

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

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

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

{% endwith %}

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

1 个答案:

答案 0 :(得分:0)

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

settings.py - 添加到TEMPLATES(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 - 未设置&#39;标题&#39;的模板在观点中:

{% 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中的两个位置,即使它在派生模板中定义但出现在顶部模板中。