如何检查Django模板变量是否已定义?

63

我有一个Django模板,用于许多视图。该模板具有用于通知用户应注意的任何内容的消息块。是否发送消息取决于视图。一些视图可能会向模板发送 message 变量,而其他视图可能不会。

<code>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))
</code>
在模板中,我检查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>,基本上是一个空的

元素。

由于该CSS的设计是为消息提供浅红色背景,因此我在页面顶部看到了一个空的浅红色条。

我还尝试过:{% ifnotequal message None %}{% ifnotequal message '' %},尝试将message显式设置为None'',但似乎没有帮助。

希望能得到一些帮助!

3个回答

73

你需要交换你的{% block %}{% if %}

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

1
谢谢@Colleen。那个方法可行。不过,您能否解释一下为什么另一种方式不行呢?我只是觉得,只有当消息存在时才包含该块是很合理的。 - zaphod
认为这是因为您在基本模板中有{% block messages %},django模板渲染引擎会将其寻找并注入到扩展它的任何地方,并忽略它周围的任何if或其他内容。话虽如此,我不能向您发誓,在{% block %}周围使用{% if %}是否有效-我从未尝试过,所以我也不知道。可能永远不起作用,这就是主要问题,不是您在基础中有{% block messages %} - Colleen
2
https://dev59.com/I0fSa4cB1Zd3GeqPAdfZ让人觉得好像是前者。我认为如果您的`{% if %}`在base中,那么它将起作用。或者如果该块不在base中。 - Colleen
3
如果“message”为0怎么办?也许您想显示值0,那么您将不得不使用{% if messages != None %} - destresa

45

要检查一个if语句中的值,你需要将值与None进行比较,例如:

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

我尝试了其他答案,但直到我阅读有关如何处理无效变量的文档并理解了上述内容后才起作用。


3
这对我非常有效。 在我的使用场景中,我从搜索中获取了一系列结果,如果我使用{% if result %}即使“result”已定义但为空,它也会失败。 我希望在“result”被定义时通过,在未定义时失败。 对于空的“result”,我想显示另一条消息。 检查“None”非常有效。 - Anupam
我一定是漏掉了什么,因为从表面上看,那个if/else语句根本没有意义!如果某个缺失的变量存在且不为None,那该怎么办?我想通常情况下都会出现这种情况,因为毕竟如果一个变量存在,那么调用者很可能已经将其设置为某些值了! - John R Ramsden

5
如果您不想在模板上下文中没有变量时用 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}

1
正是我所需要的,完美地运作着,谢谢! - scūriolus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接