59

我需要检查变量texts是否在index.html.

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

基本上这在 PHP

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

索引.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 里怎么说?

4

8 回答 8

59

我认为你最好的选择是结合定义()检查以及通​​过长度()函数查看数组的长度:

{% if texts is defined and texts|length > 0 %}
    ...
{% endif %}
于 2016-07-25T17:19:26.403 回答
54

要测试是否存在(“已定义”?),请使用is defined.

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

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

一个人为的例子可能是

{% if (texts is defined) and texts %}
    The first text is {{ texts[0] }}
{% else %}
    Error!
{% endif %}
于 2015-05-05T20:15:29.867 回答
32

查看 Jinja2 的文档:http defined(): //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 %}
于 2012-05-08T18:06:34.723 回答
12

文档中所述,您还可以编写:

{% 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为空的情况。

于 2017-04-07T14:34:30.010 回答
5

这是一个简洁而简单的解决方案,对我来说效果很好!

{% if texts is defined and texts[0] is defined %}
    ...
{% endif %}
于 2018-08-10T22:16:27.880 回答
2

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

texts = ['']

在这种情况下,测试 if textsis defined 将产生一个真实的结果,因此您应该测试第一个元素:

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

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

于 2016-06-09T23:42:40.143 回答
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 %}
于 2020-11-22T05:34:17.860 回答
0

这对我有用(但我确保返回一个空数组 [] 而不是 None 如果它是空的)

{% if array  %}

   <table class="table">
       ...
   </table>

{% endif %}
于 2021-10-03T10:27:27.720 回答