【问题标题】:Django: with tag outside blocksDjango:在块外带有标签
【发布时间】:2013-07-13 18:08:30
【问题描述】:

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

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

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

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

{% endwith %}

上面的模板没有显示任何内容,因为 my_var 没有在这些块中传递。 我该如何克服这个问题?

【问题讨论】:

  • 我不认为block 的原因。您可以通过查看{% block test1 %}{% with my_var1=1 %}{{my_var1}}{% endwith %}{% endblock %} 是否有效来验证吗?
  • @karthikr 是的,我确定这一点,刚刚测试过。如果可能的话,我会使用 Django 1.3。
  • 我在使用 Django 1.6.1 时遇到了同样的问题。你能解决这个问题吗?
  • Django 1.10。我也有。在块内移动 {% with ... %} 使其工作。

标签: django django-templates


【解决方案1】:

我是通过将 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 -- 没有在视图中设置“标题”的模板:

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

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 2014-10-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2019-12-04
    • 2012-11-09
    相关资源
    最近更新 更多