Пользовательское сообщение об ошибке в действиях администратора Django
Я написал пользовательские действия администратора, которые в основном выполняют QuerySet.update()
для определенных полей модели. Бывают случаи, когда эти действия не должны заканчиваться - вместо этого они должны отображать ошибку и ничего не делать. Я пробовал message_user
, но на нем отображается зеленая галочка, в то время как мне бы хотелось, чтобы она отображала сообщение об ошибке администратора Django.
Решение, которое я нашел в Интернете, это использовать ModelForm
, но я не думаю, что это применимо в этом случае, так как здесь все происходит на странице списка изменений admin.
Ответы
Ответ 1
Функция message_user
, используемая в администраторе, просто использует пакет contrib.messages
. Вы можете попробовать что-то вроде этого:
from django.contrib import messages
# Then, when you need to error the user:
messages.error(request, "The message")
Вы также можете использовать warning
, debug
, info
и success
вместо error
Надеюсь, что это поможет!
Ответ 2
from django.contrib import messages
...
self.message_user(request, "The message", level=messages.ERROR)
Также можно использовать (messages.ERROR, messages.WARNING, messages.DEBUG, messages.INFO, messages.SUCCESS)
Ответ 3
Не уверен, что это было исправлено в новых версиях django (я нашел поведение, описанное в django 1.2.1, а также в django-grappelli 2.0), но если вы используете метод Bartek выше, вы также, вероятно, захотите изменить шаблоны администратора, чтобы отображать сообщения по-разному. В частности, в base.html:
Измените это:
{% if messages %}
<ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>
{% endif %}
:
{% if messages %}
<ul class="messagelist">{% for message in messages %}<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message}}</li>{% endfor %}</ul>
{% endif %}
Вам может понадобиться еще немного подкорректировать CSS, но, по крайней мере, это будет выглядеть как класс li в HTML.
Здесь пример изменения CSS (совместимый с grappelli)
ul.messagelist li.error {
background: url('../img/icons/icon-no.png') 20px 50% no-repeat;
background-color: #f2e6e6;
}
Ответ 4
Вы можете использовать django.contrib.messages бэкэнд
def my_action(self, request, queryset):
#do something
from django.contrib import messages
messages.error(request,'Error message')
Появится сообщение об ошибке и красный знак ошибки.