web-dev-qa-db-fra.com

Comment rediriger vers la page précédente dans Django après POST request

Je fais face à un problème pour lequel je ne trouve pas de solution. J'ai un bouton dans la barre de navigation qui est disponible sur toutes les pages et c'est un bouton chargé de créer du contenu.

Voir ce lien avec le bouton:

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 vous pouvez voir maintenant, je redirige toujours vers la page principale '/' après avoir créé le contenu, mais je veux revenir à la page avec laquelle j'ai lancé la création de contenu.

26
Oleg

Vous pouvez ajouter un champ next à votre formulaire et le définir sur request.path. Après avoir traité votre formulaire, vous pouvez rediriger vers la valeur de ce chemin.

template.html

<form method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="hidden" name="next" value="{{ request.path }}">
    <button type="submit">Let's Go</button>
</form>

views.py

next = request.POST.get('next', '/')
return HttpResponseRedirect(next)

C'est à peu près ce que Django.contrib.auth fait pour le formulaire de connexion si je me souviens bien.

Si vous passez par une page intermédiaire, vous pouvez passer la valeur 'suivante' via la chaîne de requête:

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>
45
Antoine Pinsard

Vous pouvez utiliser le HTTP_REFERER valeur:

return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

Notez que cela ne fonctionnera pas si le client a désactivé l'envoi d'informations sur le référent (par exemple, en utilisant une fenêtre de navigateur privée/navigation privée). Dans ce cas, il sera redirigé vers /.

18
Selcuk