Подтвердить что ты не робот

Пользовательское сообщение об ошибке в действиях администратора Django

Я написал пользовательские действия администратора, которые в основном выполняют QuerySet.update() для определенных полей модели. Бывают случаи, когда эти действия не должны заканчиваться - вместо этого они должны отображать ошибку и ничего не делать. Я пробовал message_user, но на нем отображается зеленая галочка, в то время как мне бы хотелось, чтобы она отображала сообщение об ошибке администратора Django.

Решение, которое я нашел в Интернете, это использовать ModelForm, но я не думаю, что это применимо в этом случае, так как здесь все происходит на странице списка изменений admin.

4b9b3361

Ответ 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')

Появится сообщение об ошибке и красный знак ошибки.