not name error bootstrap alertas django messages

django - name - messages error



Django: Eliminar mensaje antes de que se muestren (6)

Me gusta este enfoque más simple para eliminar el iterador subyacente, ya que en realidad quería agregar un mensaje nuevo en lugar de un mensaje Django estándar.

list(messages.get_messages(request))

Sé que esta pregunta suena rara, pero por favor, déjame explicarme.

Estoy usando un decorador para hacer que un mensaje persista hasta que el usuario lo descarte (como el comportamiento de los mensajes de desbordamiento de pila). El problema es que, como resultado de esto, el mensaje se agrega antes de que el usuario cierre la sesión, y así el mensaje se muestra justo después de que el usuario cierre la sesión. Me pregunto cuál es la mejor manera de eliminar el mensaje en la vista de cierre de sesión. He pensado en dos maneras de hacer esto, y me pregunto si alguien puede pensar en una mejor.

Actualmente estoy favoreciendo esto:

storage = messages.get_messages(request) storage.used = True

Más allá de esto:

storage = messages.get_messages(request) del storage._loaded_messages[0]

Para mí, la segunda forma parece más explícita, aunque es más fea: mi intención es eliminar los mensajes cargados actualmente y eso lo deja claro. La primera forma emplea un medio por el cual los mensajes se borrarán como un efecto secundario ... pero al menos no se basa en una variable dunder ... ¿qué piensan ustedes?


Para mí, en Django 1.5 y el método de almacenamiento de mensajes de session aceptado, no es el truco.

Necesitaba usar:

storage = messages.get_messages(request) for _ in storage: pass

Para deshacerse de los mensajes de almacenamiento.


Por el bien de la resolución, voy a marcar el método con el que fui como "La respuesta". Gracias a quienes comentaron.

Fui con esto:

storage = messages.get_messages(request) storage.used = True

Porque parecía más limpio, era más fácil de probar y se ajustaba a las prácticas generales del resto del proyecto.


Si su vista de cierre de sesión siempre redirige a una "página de cierre de sesión", entonces puede cambiar su plantilla de cierre de sesión para ocultar sus mensajes.

Por ejemplo, en la plantilla:

{% block extra-header %} <style type="text/css"> #message-id { display: none; } </style> {% endblock %}

Se siente un poco ''hacky'' pero creo que es menos hacky que tu # 2.


Tuve que usar 2 de las soluciones propuestas anteriormente, ya que nadie solo era suficiente:

storage = messages.get_messages(request) for _ in storage: pass if len(storage._loaded_messages) == 1: del storage._loaded_messages[0]

En cuanto a la solución aceptada, puedo repasar los mensajes varias veces y veo que los mensajes no parecen estar "consumidos".


Una forma de hacer lo mismo en Django Admin (probado con Django==1.11.6 ) es anular response_post_* .

def response_post_save_change(self, request, obj): storage = messages.get_messages(request) storage._loaded_messages = [] return super().response_post_save_change(request, obj)

Y si desea mantener solo sus mensajes personalizados (p. Ej., Agregado en save_model o cualquier otro método anulado) elimine el último mensaje en cola (que es el anuncio de Django por defecto).

def response_post_save_change(self, request, obj): storage = messages.get_messages(request) if len(storage._queued_messages) > 1: del storage._queued_messages[-1] return super().response_post_save_change(request, obj)