Пользовательское сообщение об ошибке в действиях администратора Django - PullRequest
30 голосов
/ 14 июля 2010

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

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

Ответы [ 4 ]

35 голосов
/ 14 июля 2010

Функция 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

Надежда, которая помогает!

29 голосов
/ 03 июля 2013
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 голосов
/ 28 июля 2011

Вы можете использовать django.contrib.messages backend

def my_action(self, request, queryset):
  #do something
  from django.contrib import messages
  messages.error(request,'Error message')

Это покажет сообщение об ошибке и красный знак ошибки.

2 голосов
/ 11 апреля 2011

Не уверен, было ли это исправлено в более новых версиях 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;

}
...