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.