139 lines
4.6 KiB
Markdown
139 lines
4.6 KiB
Markdown
---
|
||
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 #}
|
||
```
|