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

zap*_*hod 39 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))
Run Code Online (Sandbox Code Playgroud)

在模板中,我检查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 %}
     ...
Run Code Online (Sandbox Code Playgroud)

问题是即使view_2没有传递消息,最终的html也会呈现<div class='imp_msg'></div>- 基本上是一个空div.

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

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

非常感谢一些帮助!

Col*_*een 44

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

{% block messages %}
    {% if message %}<div class='imp_message'>{{ message }}</div>{% endif %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

  • 如果“消息”为 0 呢?也许你想显示值 0,那么你将不得不使用 `{% if messages != None %}` (3认同)
  • http://stackoverflow.com/questions/942797/why-cant-i-nest-a-block-tag-inside-an-if-tag让它听起来好像是前者.我想如果你的`{%if%}'在基础上,那么它会起作用.或者如果块不在基础中. (2认同)

slo*_*621 19

要检查,在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 %}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 这对我很有用.在我的用例中,我得到了一个搜索结果列表,如果我做了`{%if result%}`,即使`result`被定义但是空的,它也失败了.我希望它在定义`result`时通过,并在未定义结果时失败.对于空的`result`,我想显示另一条消息.检查"无"效果很好. (2认同)

Max*_*nko 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
Run Code Online (Sandbox Code Playgroud)

在html模板中:

{% load filters %}
...
{% var_exists 'project' as project_exists %}
{% if project_exists %}
  ...
{% endif}
Run Code Online (Sandbox Code Playgroud)