2009-09-23 29 views
31

Tengo un formulario que redirige a la misma página después de que un usuario ingresa información (para que puedan continuar ingresando información). Si el envío del formulario es exitoso, estoy devolviendo¿Cómo paso la información de contexto de la plantilla cuando uso HttpResponseRedirect en Django?

HttpResponseRedirect(request.path) 

que funciona bien. Sin embargo, también me gustaría mostrar algunos mensajes al usuario en este caso (por ejemplo, "Sus datos se han guardado" en la parte superior de la pantalla). Si no estuviera redirigiendo, simplemente devolvería estos mensajes en el diccionario de contexto. Con la redirección, sin embargo, no puedo hacer esto.

Entonces, ¿cómo puedo pasar la información de contexto de la plantilla cuando uso HttpResponseRedirect?

Lo que estoy tratando de hacer parece que sería increíblemente común, así que discúlpeme si me falta algo obvio.

+0

son éstos los usuarios conectados? –

+0

Parece que la carga de la segunda página se lleva a cabo después de otra solicitud separada del navegador (la primera respuesta devuelve un 302) por lo que no puede pasar información de una vista a otra como lo haría con HttpResponseRedirect. En mi humilde opinión, el marco de sesión es la forma más fácil de pasar información entre las solicitudes. –

Respuesta

5

La mejor manera probablemente sea usar una cadena de consulta codificada en la URL de redireccionamiento ... es un enfoque de la vieja escuela.

Se podría hacer algo como

/página /? M = 1,/página /? M = 2, etc

A continuación, analizar esa variable con request.GET en el código de la vista y el espectáculo el mensaje apropiado

6

No puede. HttpResponseRedirect envía un redireccionamiento del lado del cliente (código de estado HTTP 302) al navegador, y luego el navegador vuelve a solicitar otra página.

Puede establecer una cadena de consulta URL en el redireccionamiento, aunque será visible para el usuario y cualquier persona que intercepte solicitudes HTTP (es decir, proxies) y, por lo tanto, no es adecuada para información confidencial.

+2

¿qué pasa con el marco de sesiones? –

0

Se agrega salvado = 1 a la cadena de consulta y comprobar con algo como:?

saved = request.GET.get('saved', False) 
1

La única forma que conozco para pasar los datos con una redirección es añadir parámetros GET a la URL estás pasando en para evitar XSS hacks que te gustaría pasar una constante específica como:.?

[ruta actual que está pasando en] message = salvado

Y luego procesar el mensaje = parámetros guardado en el controlador para el camino que pasaste.

Una forma algo más complicada sería no pasar los datos en la redirección, y en su lugar utilizar algo como http://code.google.com/p/django-notify/ para almacenar datos basados ​​en sesiones que se muestran al usuario después de la redirección.

10

si utiliza autenticación y tiene un usuario conectado puede:

http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.message_set.create

GET params también son hackable. La cadena de consulta, como se menciona en otras respuestas, podría ser utilizada.

Creo que la forma más preferida sería utilizar el marco de sesiones.De esa manera usted puede cargar hasta lo que quiera en el contexto y obtener

{{ request.session.foo }} 

foo podría ser el mensaje o que podía hacer:

{% ifequal request.session.foo 1 %} Nice work! {% else %} Almost! {% endifequal %} 

y otras cosas divertidas.

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

+0

como en request.session ['foo'] = 1? –

+0

sí, para el segundo código de plantilla. o, para el primer fragmento de plantilla, puede colocar todo el mensaje allí según la lógica. –

+0

Nunca me di cuenta de lo fácil que era usar sesiones en Django ... Gracias por sugerir esto. He usado este método y funciona muy bien. – nicorellius

0

Desde su views.py que Hast tiene que poner una clave/valor de par en la sesión y luego leerlo de la plantilla HTML.

Por ejemplo:

views.py

# your code here 
request.session['vote'] = 1 
return HttpResponseRedirect(request.path) 

your_template.html

{% ifequal request.session.vote 1 %} 
    <!-- Your action here --> 
{% endifequal %} 
+0

Una respuesta anterior, pero sospecho que algo así podría usarse para la pregunta que hice aquí: http://stackoverflow.com/questions/41317128/using-httpresponseredirect-in-a-django-view-where-context-has -to-be-passed Me encantaría escuchar tus pensamientos si tienes tiempo :-) –

45

En aras de terminación y referencia futura, ahora se puede utilizar the messages framework. Después de instalarlo:

views.py

from django.contrib import messages 

def view(request): 
    # your code 
    messages.success(request, "Your data has been saved!") 
    HttpResponseRedirect(request.path) 

template.html

{% if messages %} 
<ul class="messages"> 
    {% for message in messages %} 
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
</ul> 
{% endif %} 
Cuestiones relacionadas