Django for ...空时用不同的容器清空
Django for...empty with different container when empty
我有一个通用模式,其中我在 HTML 中有一个容器(例如,ul、table ...),其中包含来自查询集的元素。但是,当列表为空时,我不想显示容器本身。
我寻求获得相当于
{% if query.exists %}
<ul class="list-of-stuff">
{% for x in query %}
<li>{{ x }}</li>
{% endfor %}
</ul>
{% else %}
<p class="information">
The list is empty.
</p>
{% endif %}
但没有额外查询 (query.exists
),很像 for...empty
。但是,for...empty
的一大缺点是当列表为空时我无法删除或更改容器。
如何以干净的方式仅执行一次查询(即,不显示容器标签 if forloop.first
等)获得与上述等效的内容?我愿意实施新的标签或过滤器,或者使用带有这些的轻量级库。
您可以检查 query
本身的真实性,这会将数据加载到内存中,因此它只是一个 单个 查询。因此我们检查 {% if query %}
,而不是 {% if query.exists %}
:
{% if <strong>query</strong> %}
<ul class="list-of-stuff">
{% for x in query %}
<li>{{ x }}</li>
{% endfor %}
</ul>
{% else %}
<p class="information">
The list is empty.
</p>
{% endif %}
事实上,如果 QuerySet
包含 至少一个元素 ,则它具有真实性 True
。它将因此进行查询,并将数据加载到内存中。如果没有记录,则 {% if query %}
失败,因此我们呈现列表为空。如果至少有一行,则 {% if query %}
成功,然后我们不必进行额外的查询来枚举 query
.
我有一个通用模式,其中我在 HTML 中有一个容器(例如,ul、table ...),其中包含来自查询集的元素。但是,当列表为空时,我不想显示容器本身。
我寻求获得相当于
{% if query.exists %}
<ul class="list-of-stuff">
{% for x in query %}
<li>{{ x }}</li>
{% endfor %}
</ul>
{% else %}
<p class="information">
The list is empty.
</p>
{% endif %}
但没有额外查询 (query.exists
),很像 for...empty
。但是,for...empty
的一大缺点是当列表为空时我无法删除或更改容器。
如何以干净的方式仅执行一次查询(即,不显示容器标签 if forloop.first
等)获得与上述等效的内容?我愿意实施新的标签或过滤器,或者使用带有这些的轻量级库。
您可以检查 query
本身的真实性,这会将数据加载到内存中,因此它只是一个 单个 查询。因此我们检查 {% if query %}
,而不是 {% if query.exists %}
:
{% if <strong>query</strong> %}
<ul class="list-of-stuff">
{% for x in query %}
<li>{{ x }}</li>
{% endfor %}
</ul>
{% else %}
<p class="information">
The list is empty.
</p>
{% endif %}
事实上,如果 QuerySet
包含 至少一个元素 ,则它具有真实性 True
。它将因此进行查询,并将数据加载到内存中。如果没有记录,则 {% if query %}
失败,因此我们呈现列表为空。如果至少有一行,则 {% if query %}
成功,然后我们不必进行额外的查询来枚举 query
.