Add documentation and source
Added documentation, source and extra files.
This commit is contained in:
138
documentation/07-model-forms.md
Normal file
138
documentation/07-model-forms.md
Normal file
@ -0,0 +1,138 @@
|
||||
---
|
||||
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
|
||||
|
||||

|
||||
|
||||
----
|
||||
|
||||
## 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.
|
||||
|
||||
----
|
||||
|
||||

|
||||
|
||||
----
|
||||
|
||||

|
||||
|
||||
----
|
||||
|
||||
## 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 #}
|
||||
```
|
Reference in New Issue
Block a user