python - example - ¿Cómo paso la información de contexto de la plantilla cuando uso HttpResponseRedirect en Django?
httpresponseredirect django (7)
Agregas? Saved = 1 a la cadena de consulta y la compruebas con algo como:
saved = request.GET.get(''saved'', False)
Tengo un formulario que redirige a la misma página después de que un usuario ingresa información (para que pueda continuar ingresando información). Si el envío del formulario es exitoso, regresaré
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.
Desde su views.py tiene que poner un par clave / valor en la sesión y luego leerlo desde 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 %}
La única manera que conozco de pasar datos con una redirección es agregar parámetros GET a la URL que está pasando. Para evitar los ataques XSS, querría pasar una constante específica como:
[ruta actual que está pasando]? mensaje = guardado
Y luego procese el mensaje = parámetro guardado en el manejador de la ruta que pasó.
Una forma algo más complicada sería no pasar los datos en el redireccionamiento y, en su lugar, usar algo como http://code.google.com/p/django-notify/ para almacenar datos basados en sesiones que se muestran al usuario después del redirigir
La mejor manera sería probablemente usar una cadena de consulta codificada en la URL de redireccionamiento ... es un enfoque de la vieja escuela.
Podrías hacer algo como
/ page /? m = 1, / page /? m = 2, etc.
A continuación, analizará esa variable con request.GET en el código de vista y mostrará el mensaje apropiado.
No puedes. 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 la redirección, aunque eso será visible para el usuario y para cualquier persona que intercepte solicitudes HTTP (es decir, proxies) y, por lo tanto, no es adecuado para información confidencial.
Por el bien de completar y referencia futura, ahora puede usar el marco de mensajes . 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 %}
Si está utilizando autenticación y tiene un usuario conectado, puede:
http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.message_set.create
Los parámetros GET también son pirateables. 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 forma puedes cargar lo que quieras en el contexto y obtener
{{ request.session.foo }}
foo
podría ser el mensaje o podrías 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