Шаблон Django: проверьте наличие пустого набора запросов

Есть ли способ проверить пустой набор запросов в шаблоне Django? В приведенном ниже примере я хочу, чтобы заголовок NOTES отображался, если есть заметки.

Если я положил {% empty%} внутри "for", тогда он отображает все, что находится внутри пустого тега, поэтому он знает, что он пуст.

Я надеюсь на то, что не требует выполнения запроса дважды.

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

Уточнение: вышеприведенный пример "если примечания" не работает - он по-прежнему отображает заголовок даже при пустом наборе запросов.

Здесь упрощенная версия представления

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))  

Изменить: выбор вида выбирает из нескольких таблиц.

Ответ 1

Попробуйте {% if notes.all %}. Это работает для меня.

Ответ 3

В вашем представлении проверьте, является ли notes пустым или нет. Если это тогда, вы передаете None вместо:

{"notes": None}

В шаблоне вы используете {% if notes %} как обычно.

Ответ 4

Несчастливо, что вы застряли с использованием набора необработанных запросов - им не хватает много полезного поведения.

Вы можете преобразовать исходный набор запросов в список в представлении:

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 %}

Ответ 5

Как насчет:

{% if notes != None %}
    {% if notes %}
        NOTES:
        {% for note in notes %}
            {{ note.text }}  
        {% endfor  %}
    {% endif %}
{% else %}
    NO NOTES AT ALL
{% endif %}

Ответ 6

Ваше оригинальное решение

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

Работает теперь с Django 1.7 и благодаря кешированию QuerySet это не требует затрат и дополнительного запроса.