【问题标题】:How to check if django template variable is defined?如何检查是否定义了 django 模板变量?
【发布时间】:2012-10-07 03:40:19
【问题描述】:

我有一个 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 也会以&lt;div class='imp_msg'&gt;&lt;/div&gt; 呈现——基本上是一个空的 div。

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

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

不胜感激!

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢@Colleen。那行得通。您能否解释一下为什么其他方式没有?我只是觉得只有在消息存在时才包含该块是合乎逻辑的。
    • 认为这是因为您的基本模板中有{% block messages %},django 模板渲染引擎会采用它并在任何扩展的地方查找并注入该块,并忽略任何ifs 或它周围的任何其他东西。话虽这么说,我不能向你发誓,{% if %}{% block %} 之间的关系会起作用——我从未尝试过,所以我不知道这两种方法。可能它永远不会起作用,这是主要问题,而不是您的基地中有{% block messages %}
    • stackoverflow.com/questions/942797/… 听起来好像是前者。我想如果你的{% if %} 在基地,那么它会起作用。或者如果该块不在基地中。
    • 如果'message'为0呢?也许您想显示值 0,那么您将不得不使用 {% if messages != None %}
    【解决方案2】:

    要检查,在 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

    【讨论】:

    • 这对我很有用。在我的用例中,我从搜索中获取结果列表,如果我执行 {% if result %},即使 result 已定义但为空,它也会失败。我希望它在定义 result 时通过,而在未定义结果时失败。对于空的result,我想显示另一条消息。检查None 效果很好。
    • 我一定遗漏了什么,因为从表面上看,if/else 完全没有意义!如果 some_missing_var 存在并且不是 None 怎么办?我想这通常会是这种情况,因为毕竟如果存在变量,那么调用者很可能会将其设置为某个值!
    【解决方案3】:

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

    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}
    

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 2010-09-22
      • 2017-01-09
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 2021-04-21
      • 2021-10-03
      相关资源
      最近更新 更多