diff --git a/book/gwift/05-forms.md b/book/gwift/05-forms.md index e69de29..62d8d35 100644 --- a/book/gwift/05-forms.md +++ b/book/gwift/05-forms.md @@ -0,0 +1,39 @@ +Forms +===== + +Les forms ne s'appliquent pas uniquement pour les rendus de formulaires dans votre page web, mais pour toute information qui doit être entrée dans la base de données. Ils jouent en fait plusieurs rôles: validation des données (en plus de celles déjà définies au niveau du modèle), contrôle de la manière dans les champs doivent être visualisables, ... et agissent comme une colle entre l'utilisateur et la modélisation de vos tables et structures de données. + +## Dépendance avec le modèle + +Un **form** peut dépendre d'une autre classe Django. Pour cela, il suffit de fixer l'attribut `model` au niveau de la `class Meta` dans la définition. + +```python +from django import forms + +from wish.models import Wishlist + +class WishlistCreateForm(forms.ModelForm): + class Meta: + model = Wishlist + fields = ('name', 'description') +``` + +De cette manière, notre form dépendra automatiquement des champs déjà déclarés dans la classe `Wishlist`. Cela suit le principe de [DRY](don't repeat yourself), et évite qu'une modification ne pourrisse le code: en testant les deux champs présent dans l'attribut `fields`, nous pourrons nous assurer de faire évoluer le formulaire en fonction du modèle sur lequel il se base. + +## Contrôle du rendu + +Le formulaire permet également de contrôler le rendu qui sera appliqué lors de la génération de la page. Si les champs dépendent du modèle sur lequel se base le formulaire, ces widgets doivent être initialisés dans l'attribut `Meta`. Sinon, ils peuvent l'être directement au niveau du champ. + +```python +from django import forms +from datetime import date +from .models import Accident + +class AccidentForm(forms.ModelForm): + class Meta: + model = Accident + fields = ('gymnast', 'educative', 'date', 'information') + widgets = { + 'date' : forms.TextInput(attrs={'class' : 'form-control', 'data-provide' : 'datepicker', 'data-date-format' : 'dd/mm/yyyy', 'placeholder' : date.today().strftime("%d/%m/%Y")}), + 'information' : forms.Textarea(attrs={'class' : 'form-control', 'placeholder' : 'Informations about accident : context (why, where, …), consequencies, …'}) +```