Ответ 1
Попробуйте {% if notes.all %}
. Это работает для меня.
Есть ли способ проверить пустой набор запросов в шаблоне 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))
Изменить: выбор вида выбирает из нескольких таблиц.
Попробуйте {% if notes.all %}
. Это работает для меня.
Посмотрите на тег {% 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
В вашем представлении проверьте, является ли notes
пустым или нет. Если это тогда, вы передаете None
вместо:
{"notes": None}
В шаблоне вы используете {% if notes %}
как обычно.
Несчастливо, что вы застряли с использованием набора необработанных запросов - им не хватает много полезного поведения.
Вы можете преобразовать исходный набор запросов в список в представлении:
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 %}
Как насчет:
{% if notes != None %}
{% if notes %}
NOTES:
{% for note in notes %}
{{ note.text }}
{% endfor %}
{% endif %}
{% else %}
NO NOTES AT ALL
{% endif %}
Ваше оригинальное решение
{% if notes %}
Header
{% for note in notes %}
{{ note.text }}
{% endfor %}
{% endif %}
Работает теперь с Django 1.7 и благодаря кешированию QuerySet это не требует затрат и дополнительного запроса.
{% for book in books %}
<li>{{ book }}</li>
{% empty %}
<li>Sorry, there are no books.</li>
{% endfor %}
как получено из: введите описание ссылки здесь