J'ai créé un formulaire de contact de base, et lorsque l'utilisateur soumet des informations, il doit rediriger vers la page "Merci".
views.py:
def contact(request):
# if no errors...
return HttpResponseRedirect('/thanks/')
rls.py:
(r'^contact/$', contact),
(r'^contact/thanks/$', contact_thanks),
Les deux pages fonctionnent à l'URL codée en dur. Cependant, lorsque je soumets le formulaire sur /contact/
, Il redirige vers /contact
(Pas de barre oblique de fin), qui est une page inexistante (soit une 404 soit une page d'erreur me disant que j'ai besoin d'une barre oblique).
Quelle est la raison pour laquelle il ne redirige pas correctement et comment puis-je résoudre ce problème?
PDATE: la return HttpResponseRedirect('/contact/thanks/')
est ce que j'ai maintenant, mais le problème est que le bouton d'envoi (en utilisant POST) ne redirige pas vers l'URL - il ne redirige pas du tout .
Ce n'est pas le bouton POST qui devrait rediriger, mais la vue.
S'il n'est pas spécifié différemment, le formulaire (la balise de formulaire HTML) se POST vers la même URL. Si le formulaire est sur/contact /, il POSTE sur/contact/(avec ou sans barre oblique, c'est pareil).
C'est dans la vue que vous devez rediriger vers merci. Du doc:
def contact(request):
if request.method == 'POST': # If the form has been submitted...
form = ContactForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
# ...
return HttpResponseRedirect('/thanks/') # Redirect after POST
else:
form = ContactForm() # An unbound form
return render_to_response('contact.html', {
'form': form,
})
Changement /thanks/
à /contact/thanks/
et tu as fini.
Toutes les réponses sont correctes mais une meilleure approche consiste à donner des noms à vos URL dans urls.py
et faites-leur allusion dans les vues avec fonction inverse (au lieu de coder en dur l'URL dans les vues).
urls.py:
(r'^contact/$', contact, name='contact'),
(r'^contact/thanks/$', contact_thanks, name='thanks'),
Et indiquez-les dans views.py comme ceci:
from Django.urls import reverse
return HttpResponseRedirect(reverse('app_name:thanks'))
C'est mieux pour une approche future et suivez le DRY principe de Django .
Je crois qu'en dehors de la solution d'Aviral Dasgupta, OP doit également changer l'url relative.
return HttpResponseRedirect('/thanks/')
à
return HttpResponseRedirect('/contact/thanks/')
/thanks/
devrait prendre l'URL à la racine: yoursite/thanks/
et pas yoursite/contact/thanks/
.
Essayez ça. Ça a marché pour moi.
return HttpResponseRedirect('thanks/')
Remarque: - Retirez la barre oblique avant
Utilisez le paramètre Django APPEND_SLASH .
Lorsqu'il est défini sur True, si l'URL de demande ne correspond à aucun des modèles de l'URLconf et ne se termine pas par une barre oblique, une redirection HTTP est émise vers la même URL avec une barre oblique ajoutée. Notez que la redirection peut entraîner la perte de toutes les données soumises dans une demande POST.