我需要检查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中说这个?
答案 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 %}