检查Jinja2中的数组是否为空

时间:2012-05-08 18:03:28

标签: jinja2

我需要检查texts中是否定义了变量index.html

如果定义了变量而不是空,那么我应该渲染循环。否则,我想显示错误消息{{error}}

基本上这是PHP中的

if (isset($texts) && !empty($texts)) {
    for () { ... }
}
else {
    print $error;
}

的index.html

{% for text in texts %} 
    <div>{{error}}</div>
    <div class="post">
        <div class="post-title">{{text.subject}}</div>
        <pre class="post-content">{{text.content}}</pre>
    </div>
{% endfor %}

我如何在jinja2中说这个?

7 个答案:

答案 0 :(得分:35)

要测试在场状态(“已定义”?),请使用is defined

要测试当前列表是否为空,请使用列表本身作为条件。

虽然它似乎不适用于您的示例,但如果您需要循环以外的其他内容,则此形式的空白检查很有用

一个人为的例子可能是

{% if (texts is defined) and texts %}
    The first text is {{ texts[0] }}
{% else %}
    Error!
{% endif %}

答案 1 :(得分:26)

我认为您最好的选择是定义()检查以及通​​过length of the array查看length() function的组合:

{% if texts is defined and texts|length > 0 %}
    ...
{% endif %}

答案 2 :(得分:20)

查看Jinja2 defined()http://jinja.pocoo.org/docs/templates/#defined

的文档
{% if variable is defined %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined
{% endif %}

足够清楚了吗?在你的情况下,它可能看起来像这样:

{% if texts is defined %}
    {% for text in texts %} 
        <div>{{ error }}</div>
        <div class="post">
            <div class="post-title">{{ text.subject }}</div>
            <pre class="post-content">{{ text.content }}</pre>
        </div>
    {% endfor %}
{% else %}
    Error!
{% endif %}

答案 3 :(得分:6)

the documentation中所述,您也可以写:

{% for text in texts %}
    <div class="post">
        <div class="post-title">{{text.subject}}</div>
        <pre class="post-content">{{text.content}}</pre>
    </div>
{% else %}
    <div>{{ error }}</div>
{% endfor %}

它处理未定义texts的情况和texts为空的情况。

答案 4 :(得分:2)

可能texts可以定义,但包含一个空字符串的列表元素;例如:

texts = ['']

在这种情况下,测试是否定义texts将产生真实结果,因此您应该测试第一个元素:

{% if texts[0] != '' %}
    ..code here..
{% endif %}

您可能还希望将其与|length过滤器结合使用,以确保它只有一个元素。

答案 5 :(得分:1)

这是一种简洁易用的解决方案,对我来说效果很好!

{% if texts is defined and texts[0] is defined %}
    ...
{% endif %}

答案 6 :(得分:0)

这是在我的Django应用中适用于我的用例的内容:

我需要将查询集作为上下文传递给html模板,并仅在查询集具有值时才显示该块

魁北克

events = Event.objects.filter(schedule_end__gte=date.today()).order_by('-created_at')

通过上下文字典如下:

{"events" : events }

HTML模板

{% if events %}
  <h3>Upcoming Events</h3>
  <ul>
    {% for event in events %}
    <li><h4>{{ event.title }}</h4></li>
    {% endfor %}
  </ul>
{% endif %}