Files
training.django/documentation/07-model-forms.md
Steve Kossouho e3ebf6bf4f Add documentation and source
Added documentation, source and extra files.
2025-07-02 20:26:50 +02:00

139 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Django
author: Steve Kossouho
---
# Utiliser des formulaires avec la base de données
----
## Définition de formulaires basés sur les modèles
### Qu'est-ce qu'un `ModelForm` ?
Un `ModelForm` est une classe spéciale de formulaire dans Django qui génère automatiquement un formulaire à partir d'un modèle spécifié.
```python
from django import forms
from .models import MonModel
class MonModelForm(forms.ModelForm):
class Meta:
model = MonModel
fields = '__all__'
```
Ici, un formulaire est créé pour le modèle `MonModel`. L'option `fields = '__all__'` signifie que tous les champs du modèle sont inclus dans le formulaire.
----
## Utilisation des formulaires et validation
----
### Utilisation de `ModelForm` dans une vue
Un `ModelForm` peut être utilisé dans une vue de la même manière qu'un formulaire normal. Voici un exemple de vue qui utilise un `ModelForm`.
```python
from django.shortcuts import render
from .forms import MonModelForm
def ma_vue(request):
if request.method == 'POST':
form = MonModelForm(request.POST)
if form.is_valid():
form.save()
else:
form = MonModelForm()
return render(request, 'ma_template.html', {'form': form})
```
Dans cet exemple, si la requête est une requête POST et que le formulaire est valide, le modèle associé est automatiquement enregistré en base de données grâce à la méthode `form.save()`.
----
## Gestion des téléchargements
----
### Téléchargements de fichiers avec `ModelForm`
Pour gérer le téléchargement de fichiers avec un `ModelForm`, il est nécessaire d'utiliser un champ `FileField` ou `ImageField` dans le modèle. Il faut également passer `request.FILES` à l'instance `ModelForm`.
```python
class MonModel(models.Model):
mon_fichier = models.FileField(upload_to='mes_fichiers/')
# Dans la vue
def ma_vue(request):
if request.method == 'POST':
form = MonModelForm(request.POST, request.FILES)
if form.is_valid():
form.save()
else:
form = MonModelForm()
return render(request, 'ma_template.html', {'form': form})
```
Ici, si un fichier est téléchargé via le formulaire, il est automatiquement sauvegardé dans le répertoire `mes_fichiers/`.
----
# Utiliser des formulaires avec la base de données
Utiliser des formulaires qui correspondent à nos définitions de modèles est assez simple. Il suffit de créer une classe héritant de `django.forms.ModelForm`. Le formulaire correspondant contient automatiquement des champs
reflétant ceux de notre modèle.
----
## Définition de formulaires basés sur les modèles
![Définition d'un formulaire de modèle](assets/images/modelforms-definition.png)
----
## Utilisation des formulaires et validation
L'utilisation des formulaires de modèles ressemble beaucoup à l'utilisation de formulaires standard. Il existe toutefois quelques différences, notamment pour la gestion de l'enregistrement de données et la modification de données existantes.
----
![Utilisation du formulaire non lié à un objet](assets/images/modelforms-new-instance.png)
----
![Utilisation du formulaire lié à un objet](assets/images/modelforms-bind-instance.png)
----
## Gestion des téléchargements
Lorsque vous souhaitez gérer des téléchargements de fichier, vous devriez configurer deux paramètres dans votre projet, qui sont :
- Le répertoire des fichiers média : `MEDIA_ROOT`
- L'URL de base pour les afficher, `MEDIA_URL` (par défaut `"/media/"`)
- Configurer les URLs pour servir des fichiers média :
- Ajouter `+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)` aux URLs du projet pour servir les fichiers (ne fonctionne pas si `DEBUG = False`
- Avoir un formulaire HTML avec la méthode `POST` et le type d'encodage `enctype="multipart/form-data"`.
Sans `MEDIA_ROOT`, les fichiers seront uploadés et sauvés à la racine de votre projet (même pas dans un répertoire `media`), ce qui est fortement déconseillé.
----
L'avantage par rapport aux formulaires standard est que la gestion du téléchargement des fichiers se fait automatiquement
lorsque vous persistez vos données de formulaire en faisant
```python
form = MyForm(request.POST, request.FILES, instance=my_instance) # notez le request.FILES
form.save(commit=True)
```
----
Lorsque votre modèle possède des champs fichier, vous pouvez facilement accéder à l'URL du fichier uploadé en utilisant la propriété `url` du champ `FileField` ou `ImageField` :
```djangotemplate
{{ item.picture_field.url }} {# URL commençant par settings.MEDIA_URL #}
```