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
Liens | Site |
---|---|
Django - Keep the form values filled after form validation | stackoverflow |
djangoproject | django doc |
Hide None value of django form field | stackoverflow |
Django set default form values | stackoverflow |
Display a default value in form fields Django | stackoverflow |
Django multiple forms and keep field data input after submission | stackoverflow |