11

Tengo un botón en la página xy la página y que redirige a la página z. En la página z, tengo un formulario que debe completarse. Al guardarlo, quiero redireccionar a la página x o y (la que estuve inicialmente).Django Redirigir a la vista anterior

Normalmente, utiliza "redirigir" en la vista y especifica la página a la que desea redirigir. ¿Pero qué harías en un caso como este?

¿Alguna idea?

Gracias!

Respuesta

10

Puede usar los parámetros GET para rastrear desde qué página llegó a la página z. Entonces, cuando llegue normalmente a la página z, recordaremos de qué página venimos. Cuando procesa el formulario en la página z, usamos la información previamente guardada para redirigir. Por lo tanto:

El botón/enlace de la página y debe incluir un parámetro cuyo valor es la dirección URL actual:

<a href="/page_z/?from={{ request.path|urlencode }}" />go to form</a> 

Luego, en vista de page_z que puede pasar esta en la plantilla:

def page_z_view(self, request): 
    ... 
    return render_to_response('mytemplate.html', { 'from' : request.GET.get('from', None) }) 

y en la plantilla de formulario:

<form action="{% if from %}?next={{ from }}{% endif %}" /> 
... 

Así que ahora la forma - cuando se presente - pasará en un next parámetro que indica a dónde volver una vez que el formulario se envía correctamente. Necesitamos revist el fin de realizar esta:

def page_z_view(self, request): 
    ... 
    if request.method == 'POST': 
     # Do all the form stuff 
     next = request.GET.get('next', None) 
     if next: 
      return redirect(next) 
    return render_to_response('mytemplate.html', { 'from' : request.GET.get('from', None)} 
+0

así que mi botón en la página y debe ser algo como esto: ? Por alguna razón, eso no está funcionando. Por un lado, mi formulario ya no se guarda a pesar de que el "siguiente" está bajo mi forma if válida. Y me están redirigiendo a la página de bienvenida original ... aunque esa es la página incorrecta para empezar ... ni siquiera sé dónde Obtuve eso de lol .. – JohnnyCash

+1

He actualizado la respuesta - He puesto un extra/en la acción '

+0

gracias :) solo una corrección rápida: en tu JohnnyCash

-2

Almacene información sobre las páginas que su usuario ha visitado, para que pueda recuperarlas más tarde. Probablemente el mejor lugar para hacerlo sea en la sesión.

2

petición Django sabe cuál es la página que el usuario vino de es:

previous_page = request.META['HTTP_REFERER'] 

Contendrá algo como:

>>> print(previous_page) 
'http://www.myserver.com/myApp/z' 

ahí usted sabe de dónde vino (advirtiéndola, trátela como datos inseguros y verifíquela a fondo, incluso podría contener datos maliciosos) y utilice la información.

En primer lugar se le pasa a la plantilla como

data = { 
    ..., 
    # also indicate, that saved data are valid and user can leave 
    'previous_page': previous_page, 
} 

representar la página z.html

return render(request, 'myApp/z.html', data) 

Y en la plantilla de la página z, se agrega la etiqueta meta-refresh al. Esto causará que una vez que el formulario se guarda y carga la página, el usuario será redirigido automáticamente redirige:

{% if form_is_saved and previous_page %}<meta http-equiv="refresh" content="0; url={{ previous_page }}" />{% endif %} 

Esto tiene la ventaja de que forma se salva por la página z.html, donde se llena y se no es necesario manejarlo en las páginas xey (esta es la única forma de hacerlo si las páginas xey están fuera de su aplicación Django).

Cuestiones relacionadas