with - Cómo redirigir a la página anterior en Django después de la solicitud POST
reverse django (2)
Me enfrento a un problema para el que no puedo encontrar una solución. Tengo un botón en la barra de navegación que está disponible en todas las páginas y es un botón responsable de crear contenido.
Ver que enlaza con el botón:
def createadv(request):
uw = getuw(request.user.username)
if request.method ==''POST'':
form = AdverForm(request.POST, request.FILES)
if form.is_valid():
form.instance.user = request.user
form.save()
return HttpResponseRedirect(''/'', {''username'': request.user.username, ''uw'': uw})
args = {}
args.update(csrf(request))
args[''username''] = request.user.username
args[''form''] = AdverForm()
args[''uw''] = uw
return render_to_response(''createadv.html'', args)
Si puede ver ahora, siempre redirijo a la página principal ''/'' después de crear contenido, pero quiero volver a la página con la que inicié la creación de contenido.
Puede agregar un campo next
a su formulario y establecerlo en request.path
. Después de procesar su formulario, puede redirigir al valor de esta ruta.
template.html
<form method="POST">
{% csrf_token %}
{{ form }}
<input type="hidden" name="next" value="{{ request.path }}">
<button type="submit">Let''s Go</button>
</form>
vistas.py
next = request.POST.get(''next'', ''/'')
return HttpResponseRedirect(next)
Esto es más o menos lo que hace django.contrib.auth
para el formulario de inicio de sesión si recuerdo bien.
Si pasa a través de una página intermedia, puede pasar el valor ''siguiente'' a través de la cadena de consulta:
some_page.html
<a href="{% url ''your_form_view'' %}?next={{ request.path|urlencode }}">Go to my form!</a>
template.html
<form method="POST">
{% csrf_token %}
{{ form }}
<input type="hidden" name="next" value="{{ request.GET.next }}">
<button type="submit">Let''s Go</button>
</form>
Puedes usar el valor HTTP_REFERER
:
return HttpResponseRedirect(request.META.get(''HTTP_REFERER'', ''/''))
Tenga en cuenta que esto no funcionará si el cliente deshabilitó el envío de información de remitentes (por ejemplo, mediante una ventana de navegador privada / de incógnito). En tal caso, se redireccionará a /
.