Conserver les données après la soumission d'un formulaire sous Django

Published: 05 mai 2015

DMCA.com Protection Status

Pouvoir conserver les données d'un visiteur après la soumission d'un formulaire est intéressant, en particulier si le formulaire est invalide et que le visiteur doit de nouveau remplir celui-ci. Considérons l'exemple suivant, on dispose d'un formulaire avec deux champs obligatoires (title et content) défini dans le fichier models.py

class MyForm(forms.Form): 
    title = forms.CharField(max_length=500)
    content = forms.CharField(required=False)

Les données du formulaire sont alors contenues dans "MyForm(request.POST)" et il suffit de passer ces informations vers le template mytemplate.html' via 'return render(request, 'mytemplate.html', {'form': form}):'

def MyView(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            # to something ...
            return HttpResponseRedirect('/Welcome/')
    else:
        form = NameForm()
    return render(request, 'mytemplate.html', {'form': form})

dans le template 'mytemplate.html' on peut alors directement accéder aux données du formulaire précédemment soumis avec la syntax suivante form.title.value, illustration:

<input type="text" placeholder="" name="title" value="{{form.title.value}}">
<input type="text" placeholder="" name="content" value="{{form.content.value}}">

Note 1: exemple avec un formulaire comprenant une liste déroulante

<select name="day_name">
    <option value=0 {% if form.day_name.value == '0' %}selected{% endif%}>Lundi</option>
    <option value=1 {% if form.day_name.value == '1' %}selected{% endif%}>Mardi</option>
    <option value=2 {% if form.day_name.value == '2' %}selected{% endif%}>Mercredi</option>
</select>

Note 2: Pour définir les valeurs par défaut il faut ajouter dans le fichier models.py l'option 'initial':

class MyForm(forms.Form): 
    title = forms.CharField(max_length=500, initial='Super Title !')
    content = forms.CharField(rmax_length=500)

Note 3: Si le titre est vide par exemple pour éviter d'avoir None dans le template il suffit d'utiliser la syntax suivante

<input type="text" placeholder="" name="title" value="{{form.title.value|default_if_none:''}}">

Recherches associées