Ce post traite de la 5ème partie de la série CBV de Django, abordant comment implémenter facilement CRUD en utilisant CreateView, UpdateView, DeleteView. En combinaison avec ListView et DetailView discutées dans l'écrit précédent, vous pourrez rapidement créer une application CRUD complète capable de créer (Create), modifier (Update), and supprimer (Delete) des données.
Il est conseillé à ceux qui n'ont pas encore lu les articles précédents sur ListView et DetailView de commencer par cela.
Série d'exploration des vues basées sur des classes (CBV) ④ - Utilisation de ListView & DetailView
“Complétez facilement CRUD avec les vues génériques de Django et maximisez votre productivité!”
Dans les articles précédents, nous nous sommes concentrés sur la structure de base des CBV et les opérations de lecture (READ) via ListView et DetailView.
Dans cet article, nous allons explorer CreateView, UpdateView, et DeleteView proposés par Django, afin de compléter systématiquement les fonctionnalités de création (Create), modification (Update), et suppression (Delete) d'une application Web.
1. CreateView – Créer des données
1.1 Concept et structure de base
CreateView est une classe spécialisée parmi les vues génériques de Django, dédiée à “créer de nouveaux objets”.
-
Automatisation du traitement des formulaires: Utilise en interne la fonctionnalité
FormView
pour sauvegarder le nouvel objet dansform_valid()
et rediriger vers une URL en cas de succès. -
Fonctionne bien avec ModelForm: En spécifiant
model
,fields
, ouform_class
, le formulaire est automatiquement créé et traité.
# views.py
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .models import Post
class PostCreateView(CreateView):
model = Post
fields = ['title', 'content'] # ou form_class = PostForm
template_name = 'post_form.html'
success_url = reverse_lazy('post_list') # URL de redirection après succès
1.2 Exemple de connexion dans urls.py
# urls.py
from django.urls import path
from .views import PostCreateView
urlpatterns = [
path('posts/create/', PostCreateView.as_view(), name='post_create'),
]
1.3 Exemple de template: post_form.html
<!DOCTYPE html>
<html>
<head>
<title>Créer un nouvel article</title>
</head>
<body>
<h1>Rédiger un nouvel article</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Enregistrer</button>
</form>
</body>
</html>
Astuce: En utilisant
form_class
au lieu defields
, vous pouvez définirModelForm
dansforms.py
pour contrôler plus finement le formulaire.
2. UpdateView – Modifier des données
2.1 Concept et structure de base
UpdateView est une vue générique spécialisée pour modifier des objets existants.
-
Elle interroge automatiquement l'objet correspondant en utilisant la valeur de pk ou slug dans l'URL.
-
Le formulaire est rendu avec les données existantes pré-remplies, et les modifications sont enregistrées dans la base de données lorsque l'utilisateur soumet le formulaire.
# views.py
from django.views.generic.edit import UpdateView
from django.urls import reverse_lazy
from .models import Post
class PostUpdateView(UpdateView):
model = Post
fields = ['title', 'content']
template_name = 'post_form.html'
success_url = reverse_lazy('post_list') # URL de redirection après modification réussie
2.2 Exemple de connexion dans urls.py
# urls.py
from .views import PostUpdateView
urlpatterns = [
path('posts/<int:pk>/edit/', PostUpdateView.as_view(), name='post_update'),
]
2.3 Exemple de template (réutilisable)
Tout comme avec CreateView, vous pouvez réutiliser le template post_form.html.
Dans UpdateView, form.instance
sera déjà l'objet enregistré dans la base de données, donc les données existantes seront automatiquement remplies dans le formulaire.
3. DeleteView – Supprimer des données
3.1 Concept et structure de base
DeleteView est une vue générique utilisée pour supprimer des objets spécifiques.
-
Lorsqu'un utilisateur soumet le formulaire de confirmation de suppression, l'objet est retiré de la base de données et l'utilisateur est redirigé vers une URL spécifiée.
-
Il est conseillé de créer un template spécifique pour la confirmation de suppression pour des raisons de sécurité.
# views.py
from django.views.generic.edit import DeleteView
from django.urls import reverse_lazy
from .models import Post
class PostDeleteView(DeleteView):
model = Post
template_name = 'post_confirm_delete.html'
success_url = reverse_lazy('post_list')
3.2 Exemple de connexion dans urls.py
# urls.py
from .views import PostDeleteView
urlpatterns = [
path('posts/<int:pk>/delete/', PostDeleteView.as_view(), name='post_delete'),
]
3.3 Exemple de template: post_confirm_delete.html
<!DOCTYPE html>
<html>
<head>
<title>Suppression de l'article</title>
</head>
<body>
<h1>Suppression de l'article</h1>
<p>Êtes-vous sûr de vouloir supprimer cet article ?</p>
<form method="post">
{% csrf_token %}
<button type="submit">Supprimer</button>
<a href="{% url 'post_list' %}">Annuler</a>
</form>
</body>
</html>
Attention: DeleteView est conçu pour passer par une étape de “confirmation de suppression” pour éviter les suppressions accidentelles par l'utilisateur.
Si une suppression immédiate est souhaitée, il faut implémenter par un autre moyen (ex: FormView ou logiques personnalisées).
4. Vue d'ensemble de la dynamique pour compléter CRUD
4.1 Exemple de modèle: Post
# models.py
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
4.2 urlpatterns (version simplifiée)
urlpatterns = [
# 1) LIRE
path('posts/', PostListView.as_view(), name='post_list'), # Vue de liste (ListView)
path('posts/<int:pk>/', PostDetailView.as_view(), name='post_detail'), # Vue de détail (DetailView)
# 2) CRÉER
path('posts/create/', PostCreateView.as_view(), name='post_create'),
# 3) MODIFIER
path('posts/<int:pk>/edit/', PostUpdateView.as_view(), name='post_update'),
# 4) SUPPRIMER
path('posts/<int:pk>/delete/', PostDeleteView.as_view(), name='post_delete'),
]
4.3 Structure de dossier recommandée et fichiers template
-
templates/
-
post_list.html
-
post_detail.html
-
post_form.html
(Commun pour CreateView et UpdateView) -
post_confirm_delete.html
(DeleteView)
-
5. Comment personnaliser Create/Update/DeleteView
5.1 Contrôle détaillé des formulaires avec form_class
class PostCreateView(CreateView):
model = Post
form_class = PostForm # Désignation du ModelForm
...
Dans PostForm
, vous pouvez configurer plus précisément la validation des champs ou spécifier des widgets, permettant ainsi un contrôle plus flexible des formulaires.
5.2 Redirection dynamique avec get_success_url()
def get_success_url(self):
# Ex: Utiliser le pk du nouveau Post pour naviguer vers la page de détail
return reverse_lazy('post_detail', kwargs={'pk': self.object.pk})
self.object
fait référence à l'instance de modèle traitée actuellement dans Create/Update.
5.3 Contrôle d'accès, ajout de Mixin
-
Combinez avec LoginRequiredMixin pour créer un système où seules les utilisateurs connectés peuvent créer, modifier ou supprimer.
-
Si vous souhaitez gérer finement les permissions, envisagez PermissionRequiredMixin ou UserPassesTestMixin.
6. Comparaison avec FBV
Fonctionnalité | FBV (Vue basée sur fonction) | Create/Update/DeleteView (Vue basée sur classe) |
---|---|---|
Création (Create) | request.method == 'POST' condition, définition directe de ModelForm , écriture directe de la logique d'enregistrement |
CreateView: hériter permet de générer le formulaire→enregistrer→rediriger automatiquement |
Modification (Update) | Rechercher l'objet existant puis le mettre dans le formulaire, réitérer la vérification et la logique d'enregistrement lors du traitement POST | UpdateView: Charge l'objet existant→modifie→enregistre, automisation de la logique |
Suppression (Delete) | GET→rendre la page de confirmation de suppression, POST→traitement de la suppression, tout logique mélangé dans une fonction | DeleteView: Obtention de l'objet à supprimer, traitement de la suppression intégré |
Lisibilité / Maintenance | Peut entraîner des balancements multiples de logique et augmentation de la longueur du code, répétition de même logique à plusieurs endroits | Surcharge de méthode pour n'écraser que la partie nécessaire, minimisation des répétitions possible |
Productivité de développement (mots clés essentiels) | “Manuel, consommation de temps, duplication de code” | “Amélioration de la vitesse de développement (gain de temps) et de la maintenance (augmentation de la productivité)” |
7. Conclusion : Mettons en œuvre CRUD rapidement et proprement avec des vues génériques !
En utilisant CreateView, UpdateView, et DeleteView, vous pouvez réaliser des opérations CRUD avec un code extrêmement succinct et intuitif dans Django.
En particulier, les logiques de traitement de formulaire répétées et les redirections après sauvegarde de données sont automatiquement gérées, permettant aux développeurs de se concentrer sur les “logiques métier” et “UI/UX”.
Aujourd'hui, si vous comprenez déjà
ListView
+DetailView
+CreateView
+UpdateView
+DeleteView
, vous pouvez facilement composer une application CRUD de base dans Django !
Dans le prochain article, nous aborderons TemplateView & RedirectView pour examiner comment automatiser efficacement le rendu de pages simples et le traitement de redirection.
Revoir les articles précédents
“Automatisez l'implémentation de CRUD en utilisant les vues génériques de Django et,
élèvez simultanément la vitesse de développement du projet et la qualité du code !”
Aucun commentaire.