variable - Mensaje de error personalizado en acciones de administración de Django
the django project (4)
He escrito acciones de administrador personalizadas que básicamente hacen QuerySet.update()
para ciertos campos en el modelo. Hay ocasiones en que no se debe permitir que estas acciones se completen; en su lugar, deben mostrar un error y no hacer nada. He intentado message_user
, pero eso muestra una marca de verificación verde, mientras que me gustaría que muestre el mensaje de error de administración de Django.
Una solución que encontré en línea es usar un ModelForm
, pero no creo que se aplique en este caso, ya que aquí todo sucede en la página de la lista de cambios de administrador.
La función message_user
utilizada dentro del administrador simplemente usa el paquete contrib.messages
. Podrías probar algo como esto:
from django.contrib import messages
# Then, when you need to error the user:
messages.error(request, "The message")
También puede usar warning
, debug
, info
y success
en lugar de error
¡Espero que ayude!
No estoy seguro de si esto se solucionó en versiones django más recientes (encontré el comportamiento que describió en django 1.2.1 y también en django-grappelli 2.0), pero si usa el método de Bartek anterior, probablemente también desee cambiar las plantillas de administrador. para mostrar los mensajes de manera diferente. Específicamente en base.html:
Cambia esto:
{% if messages %}
<ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>
{% endif %}
a esto:
{% if messages %}
<ul class="messagelist">{% for message in messages %}<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message}}</li>{% endfor %}</ul>
{% endif %}
Es posible que aún necesite modificar algunos CSS además de eso, pero al menos aparecería como una clase li diferente en el HTML.
Aquí hay un ejemplo de cambio de CSS (compatible con grappelli)
ul.messagelist li.error {
background: url(''../img/icons/icon-no.png'') 20px 50% no-repeat;
background-color: #f2e6e6;
}
Puede usar django.contrib.messages backend
def my_action(self, request, queryset):
#do something
from django.contrib import messages
messages.error(request,''Error message'')
Esto mostrará el mensaje de error y el signo de error rojo.
from django.contrib import messages
...
self.message_user(request, "The message", level=messages.ERROR)
También se puede usar (messages.ERROR, messages.WARNING, messages.DEBUG, messages.INFO, messages.SUCCESS)