57

我有一个从许多视图中使用的 django 模板。该模板有一个消息块,用于通知用户应该引起他们注意的任何事情。是否发送消息取决于视图。一些视图可能会向模板发送message变量,而其他视图可能不会。

view_1:
    message = "This is an important message"
    render_to_response("my_template.html", 
                       {'message':message, 'foo':foo, 'bar':bar},
                       context_instance = RequestContext(request))

view_2:
    message = "This is an important message"
    render_to_response("my_template.html", 
                       {'foo':foo, 'bar':bar},
                       context_instance = RequestContext(request))

在模板中,我检查message变量并包含如下块:

base_template.html:
    ....
    {% block main_body %}
         {% block messages %}
         {% endblock %}
         {% block content %}
         {% endblock %}
    {% endblock %}
    ....

 my_template.html:
     {% extends base_template.html %}
     ....
     {% if message %}
          {% block messages %}
              <div class='imp_msg'>{{ message }} </div>
          {% endblock %}
     {% endif %}
     ...

问题是即使 view_2 没有传递消息,最终的 html 也会被渲染<div class='imp_msg'></div>——基本上是一个空的 div。

由于该 CSS 旨在为消息提供 light_red 背景,因此我看到的是页面顶部的空 light_red 条。

我也试过: {% ifnotequal message None %}, {% ifnotequal message '' %}, 尝试设置messagetoNone''明确,但似乎没有帮助。

将不胜感激一些帮助!

4

3 回答 3

64

你需要切换你的{% block %}和你的{% if %}

{% block messages %}
    {% if message %}<div class='imp_message'>{{ message }}</div>{% endif %}
{% endblock %}
于 2012-10-16T23:18:04.177 回答
39

要检查,在 if 语句中,您需要将值与 进行比较None,如下所示:

{% if some_missing_var is None %}
   // code here if some_missing_var exists
{% else %}
   // code here if some_missing_var does not exist
{% endif %}

在其他情况下(来自文档):

通常,如果变量不存在,模板系统会插入引擎的 string_if_invalid 配置选项的值,默认设置为 ''(空字符串)。

我尝试了其他一些答案,但直到我阅读了有关如何处理无效变量的文档并且将上述内容弄清楚后,它们才起作用。

链接到描述处理无效变量的文档

于 2016-03-24T23:57:25.673 回答
2

如果您不想KeyError在模板上下文中没有变量时乱扔日志,我建议使用 templatetags 过滤器。

myapp/templatetags/filters.py我添加:

@register.simple_tag(takes_context=True)
def var_exists(context, name):
    dicts = context.dicts  # array of dicts
    if dicts:
        for d in dicts:
            if name in d:
                return True
    return False

在 html 模板中:

{% load filters %}
...
{% var_exists 'project' as project_exists %}
{% if project_exists %}
  ...
{% endif}
于 2021-01-13T21:19:45.247 回答