33

有没有办法检查 Django 模板中的空查询集?在下面的示例中,我只希望在有注释时显示 NOTES 标题。

如果我在“for”里面放了一个 {% empty %} 那么它会显示空标签内的任何内容,所以它知道它是空的。

我希望得到不涉及两次运行查询的东西。

{% if notes - want something here that works %}
     NOTES:
     {% for note in notes %}
         {{note.text}}  
     {% endfor  %}
{% endif  %}

澄清:上面的示例“if notes”不起作用 - 即使查询集为空,它仍会显示标题。

这是视图的简化版本

sql = "select * from app_notes, app_trips where"
notes = trip_notes.objects.raw(sql,(user_id,))

return render_to_response(template, {"notes":notes},context_instance=RequestContext(request))  

编辑:视图选择从多个表中选择。

4

8 回答 8

42

看看{% empty %}标签。文档中的示例

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>

链接:https ://docs.djangoproject.com/en/1.8/ref/templates/builtins/#for-empty

于 2016-01-25T22:48:42.277 回答
36

试试{% if notes.all %}。这个对我有用。

于 2013-10-01T09:16:33.577 回答
6

在您看来,检查是否notes为空。如果是,那么您将通过None

{"notes": None}

在您的模板中,您可以{% if notes %}正常使用。

于 2013-07-02T21:19:46.877 回答
6

不幸的是,您被原始查询集卡住了——它们缺少很多有用的行为。

您可以将原始查询集转换为视图中的列表:

notes_as_list = list(notes)
return render_to_response(template, {"notes":notes_as_list},context_instance=RequestContext(request))

然后在模板中将其检查为布尔值:

{% if notes %}
    Header
    {% for note in notes %}
        {{ note.text }}
    {% endfor %}
{% endif %}

您也可以使用以下方法在不进行转换的情况下实现它forloop.first

{% for note in notes %}
    {% if forloop.first %}
         Header
    {% endif %}
    {{ note.text }}
{% endfor %}
于 2013-07-02T21:33:27.673 回答
4

关于什么:

{% if notes != None %}
    {% if notes %}
        NOTES:
        {% for note in notes %}
            {{ note.text }}  
        {% endfor  %}
    {% endif %}
{% else %}
    NO NOTES AT ALL
{% endif %}
于 2013-07-02T20:58:02.837 回答
2

您的原始解决方案

{% if notes %}
    Header
    {% for note in notes %}
        {{ note.text }}
    {% endfor %}
{% endif %}

现在可以与 Django 1.7 一起使用,并且由于 QuerySet 缓存,它不需要成本和额外的查询。

于 2015-01-16T19:10:32.853 回答
1

通常正确的方法是使用{% with ... %}标签。这会缓存查询,因此它只运行一次,并且还为您的标记提供了比使用{% empty %}.

{% with notes as my_notes %}
{% if my_notes %}
<ul>
  {% for note in my_notes %}
  <li>{{ note }}</li>
  {% endfor %}
</ul>
{% else %}
<p>Sorry, no notes available</p>
{% endif %}
{% endwith %}

对于这个特定的示例,我不确定它有多大用处,但是如果您正在查询多对多字段,例如,这可能是您想要做的。

于 2019-12-27T18:16:15.523 回答
1

在 django 模板中使用 {% empty %}

{% if list_data %}
    {% for data in list_data %}
        {{ data.field_1 }}
    {% endfor %}
{% else %}
    <p>No data found!</p>
{% endif %}

我们可以用 {% empty %} 编写上面的代码。

{% for data in list_data %}
    {{ data.field_1 }}
{% empty %}
    <p>No data found!</p>
{% endfor %}
于 2021-12-10T09:19:17.180 回答