Comment éviter avec django la page "Confirm Form Resubmission"

Active 20 octobre 2017    /    Viewed 1699    /    Comments 0    /    Edit


Dans cet article on va voir comment éviter avec django (testé avec la 1.11) la page "Confirm Form Resubmission" pour un site web. Cette page blanche ou grisée peut apparaitre après avoir soumis un formulaire, si le visiteur clique sur rafraichir la page ou bien sur le button retour dans son navigateur. Cette caractéristique se justifie pour des raisons de sécurité, surtout si par exemple les champs du formulaire sont utilisés pour modifier la base de données. Cependant, dans certains cas, comme par exemple dans le cas d'un simple formulaire de recherche pour votre site, cela peut-être ennuyeux pour le visiteur et nuire à sa navigation.

Pour éviter la page "Confirm Form Resubmission" il faut impérativement, dans le fichier "views.py", après un formulaire valide (soumis avec la méthode "POST") rediriger, par exemple, avec la fonction HttpResponseRedirect, même si vous redirigez uniquement vers la même vue.

Si on ne veut pas répéter l'ensemble des operations effectuées après un formulaire valide on peut tout simplement sauvegarder les champs du visiteur dans une session. Exemple avec un simple formulaire de recherche pour un site:

models.py

class Search_Form(forms.Form):
    key_word = forms.CharField(required=False)

views.py

from .models import Search_Form

def Search_View(request):
    if request.method == 'POST':
        form = Search_Form(request.POST)
        if form.is_valid():
            key_word = request.POST['key_word']
            request.session['note_search_page'] = request.path
            request.session['note_search_key_words'] = key_word
            return HttpResponseRedirect(request.path)
    else:
        if 'note_search_page' in request.session:
            if request.path == request.session['note_search_page']: 
                key_word = request.session['note_search_key_words']
                # do something
    context = {}
    return render(request, "search_page.html", context)

L'important à retenir ici est qu'après un formulaire il faut toujours rediriger vers quelque chose.

Références

Liens Site
django form resubmitted upon refresh stackoverflow
djangoproject djangoproject


Card image cap
profile-image
Daidalos

Hi, I am Ben.

I have developed this web site from scratch with Django to share with everyone my notes. If you have any ideas or suggestions to improve the site, let me know ! (you can contact me using the form in the welcome page). Thanks!