2010-11-03 39 views
21

Sé que esta pregunta suena rara, pero permítanme que me explique.Django: Eliminar mensaje antes de que se muestren

Estoy usando un decorador para hacer que un mensaje persista hasta que el usuario realmente 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, por lo que 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 formas de hacerlo y me pregunto si alguien puede pensar en una mejor.

estoy actualmente momento a esta:

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

Durante este:

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

Para mí la segunda forma parece más explícita, a pesar de que es más feo: mi intención es eliminar la actualidad mensajes cargados y esto 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 depende de una variable dunder ... ¿qué piensan ustedes?

+0

Supongo que storage.used = True se implementa por defecto. No necesitas escribirlo. Debe escribir storage.used = False si anula el comportamiento predeterminado. –

+2

Terminé yendo con mi primer método. Básicamente quería forzar el comportamiento predeterminado sin mostrar los mensajes. Establecer storage.used = True hace que piense que ya se han mostrado los mensajes, y así funcionó para mí. – IntrepidDude

+2

Acepto que el primer método es mejor. Si quieres hacerlo más explícito, siempre puedes crear una función llamada 'clear_messages' que haga esos dos pasos. Entonces, si por algún motivo cambia el comportamiento de 'storage.used = True', puede actualizar la función. –

Respuesta

4

En aras de la resolución, voy a marcar el método que utilicé como "La respuesta". Gracias a quienes comentaron.

Fui con esto:

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

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

+3

Esto no funciona –

+2

"storage.used = True" no funciona en Django 1.8.2, y tuvo que iterar a través de messgaes. –

1

Si su vista de cierre de sesión siempre redirige a una "página de cierre de sesión", entonces puede simplemente 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 ciertamente menos que su hacky # 2.

+0

Cool. No había pensado en ese enfoque, pero la lógica que controla la visualización de mensajes en todo el proyecto es independiente del código de la plantilla. Además, me parece que el primer método es más fácil de probar. – IntrepidDude

+1

También puede ajustar la lógica de visualización de mensajes en '{% if user.is_authenticated%}' si no desea mostrar mensajes a usuarios anónimos. – Tom

2

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

que necesitaba usar:

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

para deshacerse de mensajes de almacenamiento.

7

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

list(messages.get_messages(request)) 
+0

Limpio y simple! – Yoone

1

tenía que usar 2 de las soluciones propuestas anteriormente Juntos como nadie sola era lo suficientemente:

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 que pueda bucle sobre los mensajes varias veces y veo que no parecen ser "consumido" los mensajes

0

Una forma de hacer lo mismo en Django administración (probado con Django==1.11.6) es para 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 se quiere mantener sólo los mensajes personalizados (por ejemplo añadido en save_model o cualquier otro método reemplazado) eliminar el último mensaje en cola (que es uno de los anuncios 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) 
Cuestiones relacionadas