web-dev-qa-db-fra.com

Django HttpResponseRedirect

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 .

19
David542

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.

22
vad

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 .

11
alireza sadeghpour

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

5
user201788

Essayez ça. Ça a marché pour moi.

return HttpResponseRedirect('thanks/')

Remarque: - Retirez la barre oblique avant

2
Jasmeet Singh

Utilisez le paramètre Django APPEND_SLASH .

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.

0
aviraldg