Django 有一个非常酷的标签,叫做 {% empty %},它可以让你这样做:
{% for item in list %}
<tr><td>{{ item }}</td></tr>
{% empty %}
<tr><td>Nothing to show!</td></tr>
{% endfor %}
这是缩写
{% if list %}
{% for item in list %}
<tr><td>{{ item }}</td?</tr>
{% endfor %}
{% else %}
<tr><td>Nothing to show!</td></tr>
{% endif %}
自从切换到 jinja,我真的很怀念这个标签 :(
那已经存在了。 在 for 循环中使用{% else %}
。 不幸的是,在 Django 创建空之前我们还有其他东西,现在重命名它以匹配 Django 语义有点奇怪。
哦,我明白了。 也许在 django 部分下的“从其他模板引擎切换”中记下这一点?
我在切换文档中没有看到这一点。 在control s tructures:for文档中提到了它,但将它放在切换文档中会很有帮助...
如果代码中的list
是生成器,并且for
和if
块的工作方式与 Python 中的相同,则if-for
构造不能解决问题因为生成器总是真实的,而且这样的构造比empty
块更不惯用。
我不知道您是否可以添加一个标志来检查循环是否已运行,检查NameError: name 'item' is not defined
或在 Jinja 级别将辅助变量添加到list(generator)
。 如果不是,那么唯一的解决方案是添加empty
块或说服 Python 开发人员空生成器应该是虚假的(通过处理StopIteration
和“推回”弹出项目来避免丑陋的检查)。
Jinja 中的else
块已经像 Django 中的empty
块一样工作。 这里不需要改变。
最有用的评论
那已经存在了。 在 for 循环中使用
{% else %}
。 不幸的是,在 Django 创建空之前我们还有其他东西,现在重命名它以匹配 Django 语义有点奇怪。