Отображение сообщений об ошибках сообщений Django
Я использовал Django Messaging Framework для отображения сообщений пользователю в шаблоне.
Я выводил их в шаблон следующим образом:
<ul>
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
Это выводит все сообщения, ошибки, предупреждение, успех и т.д.
Мне просто интересно, есть ли у кого-нибудь идеи, как отображать только сообщения об ошибках:
<ul>
{% for message in messages.errors %}
<li>{{ message }}</li>
{% endfor %}
</ul>
Самое лучшее, что я придумал до сих пор:
{% if messages %}
{% for message in messages %}
{% if forloop.first %}
{% if message.tags == 'error' %}
<div class="error">
<ul>
{% endif %}
{% endif %}
<li>{{ message }}</li>
{% if forloop.last %}
</ul>
</div>
{% endif %}
{% endfor %}
{% endif %}
Любые идеи?
Спасибо заранее.
Ответы
Ответ 1
Вы можете установить ifequal:
<ul>
{% for message in messages.errors %}
{% if 'error' in message.tags %}<li>{{ message }}</li>{% endif %}
{% endfor %}
</ul>
Отображение уровня сообщения в тег сообщения можно настроить с помощью MESSAGE_TAGS.
Ответ 2
Немного издевательства, но вы, вероятно, достигнете этого, добавив настраиваемый контекстный процессор шаблонов (см. https://docs.djangoproject.com/en/dev/ref/templates/api/) - что-то вроде
def collect_error_messages(request):
messages = get_messages(request)
error_messages = [ m for m in messages if 'error' in m.tags]
return {'error_messages': error_messages}
затем добавьте это в список TEMPLATE_CONTEXT_PROCESSORS в settings.py, а затем в шаблоны, которые вы можете сделать:
<ul>
{% for message in error_messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
Вы можете сделать вариацию на том же уровне, чтобы построить уровень ошибки отображения ошибок для сообщения, а затем перебирать каждый dict.
Ответ 3
Ответ Reto работает для меня таким образом
{% for message in messages %}
{% if 'success' in message.tags %}
<div class="alert alert-success">
<a class="close" href="#" data-dismiss="alert">×</a>
<strong>Success!</strong>
{{ message }}
</div>
{% endif %}
{% endfor %}
{% for message in messages %}
{% if 'error' in message.tags %}
<div class="alert alert-error">
<a class="close" href="#" data-dismiss="alert">×</a>
<strong>Error!</strong>
{{ message }}
</div>
{% endif %}
{% endfor %}
{% for message in messages %}
{% if 'info' in message.tags %}
<div class="alert alert-info">
<a class="close" href="#" data-dismiss="alert">×</a>
<strong>INFO!</strong>
{{ message }}
</div>
{% endif %}
{% endfor %}
Ответ 4
вы можете использовать следующие для проверки тегов сообщений.
{% if message.tags == "error" %}
your code here
{% endif %}
Ответ 5
Мне удалось использовать только теги шаблонов:
{% if messages %}
{% regroup messages by tags as messages %}
<div id="messages">
{% for tags in messages %}
<ul class="{{ tags.grouper }}">
{% for message in tags.list %}
<li>{{ message|capfirst }}</li>
{% endfor %}
</ul>
{% endfor %}
</div>
{% endif %}
Ключ {% regroup%} тег.
У этого все еще есть некоторые проблемы, потому что атрибут tags
включает extra_tags
message, поэтому, если вы используете вы получите дополнительные группы <ul>
.
В будущих версиях (возможно, 1.7) будет атрибут level_tag
, поэтому проблема скоро исчезнет.
(Как только доступен атрибут level_tag
)
{% if messages %}
{% regroup messages by level_tag as messages %}
<div id="messages">
{% for level in messages %}
<ul class="{{ level.grouper }}">
{% for message in level.list %}
<li>{{ message|capfirst }}</li>
{% endfor %}
</ul>
{% endfor %}
</div>
{% endif %}
Ответ 6
Конечно, вы можете сделать это с помощью {% regroup%}, но вы должны использовать dictsort, а также если вы хотите работать правильно. Итак, во-первых, теги должны сортироваться по имени, а затем группировать:
{% if messages %}
{% regroup messages|dictsort:"tags" by tags as message_list %}
{% for tags in message_list %}
<div class="alert alert-{{ tags.grouper }}">
<div class="container">
<ul>
{% for message in tags.list %}
<li>
{{ message }}
</li>
{% endfor %}
</ul>
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
</div>
</div>
{% endfor %}
{% endif %}