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

Published: 20 octobre 2017

DMCA.com Protection Status

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