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.
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>
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 /
.