如何检查是否定义了django模板变量?

时间:2012-10-16 23:13:46

标签: django django-templates

我有一个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 '' %},尝试明确地将message设置为None'',但似乎没有帮助。

非常感谢一些帮助!

3 个答案:

答案 0 :(得分:42)

您需要切换{% block %}{% if %}

{% block messages %}
    {% if message %}<div class='imp_message'>{{ message }}</div>{% endif %}
{% endblock %}

答案 1 :(得分:16)

要检查,在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配置选项的值,默认设置为''(空字符串)。

我尝试了其他一些答案,直到我阅读了文档并且上面的内容已经明确了之后它们才起作用。

link to docs that describe handling invalid variables

答案 2 :(得分:1)

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

KeyError 中添加:

myapp/templatetags/filters.py

在 html 模板中:

@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