In diesem Beitrag behandeln wir Teil 5 der Django-CBV-Serie, in dem wir erläutern, wie man CreateView, UpdateView, DeleteView nutzt, um CRUD einfach umzusetzen. In Kombination mit den zuvor behandelten ListView und DetailView können wir eine vollständige CRUD-Anwendung schnell zusammenstellen, die nicht nur Daten abruft, sondern auch erstellt (Create), aktualisiert (Update) und löscht (Delete).
Wir empfehlen, den vorherigen Beitrag über ListView und DetailView zu lesen, sollten Sie dies noch nicht getan haben.
Erkundung der klassenbasierten Ansichten (CBV) Serie ④ - Nutzung von ListView & DetailView
„Vollenden Sie CRUD mühelos mit Django generischen Ansichten und maximieren Sie die Produktivität!”
In den vorherigen Beiträgen haben wir uns auf die grundlegende Struktur der CBVs und die READ-Operationen mit ListView und DetailView konzentriert.
In diesem Beitrag werden wir die praktischen CreateView, UpdateView und DeleteView von Django betrachten, um eine webbasierte Anwendung zu erstellen, die systematisch die Funktionen für Erstellung (Create), Aktualisierung (Update) und Löschung (Delete) integriert.
1. CreateView – Daten erstellen
1.1 Grundkonzept und Struktur
CreateView ist eine Klasse innerhalb der Django-Geschäftslogik, die auf „das Erstellen neuer Objekte“ spezialisiert ist.
-
Automatisierte Formularverarbeitung: Intern wird die
FormView
Funktion verwendet, um imform_valid()
neue Objekte zu speichern und bei Erfolg auf eine URL weiterzuleiten. -
Gut in Kombination mit dem ModelForm: Wenn Sie die
model
-Eigenschaft undfields
oderform_class
angeben, wird das Formular automatisch generiert und verarbeitet.
# 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'] # oder form_class = PostForm
template_name = 'post_form.html'
success_url = reverse_lazy('post_list') # URL nach erfolgreichem Erstellen
1.2 Beispiel für urls.py-Verbindung
# urls.py
from django.urls import path
from .views import PostCreateView
urlpatterns = [
path('posts/create/', PostCreateView.as_view(), name='post_create'),
]
1.3 Beispieltemplate: post_form.html
<!DOCTYPE html>
<html>
<head>
<title>Neuen Beitrag erstellen</title>
</head>
<body>
<h1>Neuen Beitrag erstellen</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Speichern</button>
</form>
</body>
</html>
Tipp: Wenn Sie
form_class
anstelle vonfields
verwenden, können Sie einModelForm
informs.py
definieren, um das Formular noch feiner zu steuern.
2. UpdateView – Daten aktualisieren
2.1 Grundkonzept und Struktur
UpdateView ist eine generische Ansicht, die darauf spezialisiert ist, bestehende Objekte zu finden und zu aktualisieren.
-
Verwendet die pk oder slug-Werte in der URL, um das entsprechende Objekt automatisch abzurufen.
-
Das Formular wird gerendert und zeigt vorhandene Daten, die nach der Bearbeitung vom Benutzer in die DB gespeichert werden.
# 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 nach erfolgreichem Update
2.2 Beispiel für urls.py-Verbindung
# urls.py
from .views import PostUpdateView
urlpatterns = [
path('posts/<int:pk>/edit/', PostUpdateView.as_view(), name='post_update'),
]
2.3 Beispieltemplate (wiederverwendbar)
Ähnlich wie bei CreateView kann das Template post_form.html wiederverwendet werden.
Im UpdateView wird form.instance
bereits auf das in der DB gespeicherte Objekt gesetzt, sodass die vorhandenen Daten automatisch im Formular eingetragen werden.
3. DeleteView – Daten löschen
3.1 Grundkonzept und Struktur
DeleteView ist eine generische Ansicht, die verwendet wird, um ein bestimmtes Objekt zu löschen.
-
Wenn der Benutzer das Bestätigungsformular sendet, wird das entsprechende Objekt aus der DB entfernt und auf die angegebene URL umgeleitet.
-
Aus Sicherheitsgründen wird empfohlen, ein „Löschbestätigungs“-Template zu erstellen.
# 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 Beispiel für urls.py-Verbindung
# urls.py
from .views import PostDeleteView
urlpatterns = [
path('posts/<int:pk>/delete/', PostDeleteView.as_view(), name='post_delete'),
]
3.3 Beispieltemplate: post_confirm_delete.html
<!DOCTYPE html>
<html>
<head>
<title>Beitrag löschen</title>
</head>
<body>
<h1>Beitrag löschen</h1>
<p>Möchten Sie diesen Beitrag wirklich löschen?</p>
<form method="post">
{% csrf_token %}
<button type="submit">Löschen</button>
<a href="{% url 'post_list' %}">Abbrechen</a>
</form>
</body>
</html>
Hinweis: DeleteView ist so konzipiert, dass es den Benutzern ermöglicht, versehentliche Löschungen zu verhindern, indem ein „Löschbestätigungs“-Prozess durchlaufen wird.
Wenn Sie eine sofortige Löschung wünschen, müssen Sie dies auf andere Weise implementieren (z. B. durch FormView oder eigene Logik).
4. CRUD-Flow auf einen Blick
4.1 Beispielmodell: 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 (kurze Version)
urlpatterns = [
# 1) READ
path('posts/', PostListView.as_view(), name='post_list'), # Liste (ListView)
path('posts/<int:pk>/', PostDetailView.as_view(), name='post_detail'), # Detail (DetailView)
# 2) CREATE
path('posts/create/', PostCreateView.as_view(), name='post_create'),
# 3) UPDATE
path('posts/<int:pk>/edit/', PostUpdateView.as_view(), name='post_update'),
# 4) DELETE
path('posts/<int:pk>/delete/', PostDeleteView.as_view(), name='post_delete'),
]
4.3 Empfohlene Ordnerstruktur und Template-Dateien
-
templates/
-
post_list.html
-
post_detail.html
-
post_form.html
(gemeinsam für CreateView und UpdateView) -
post_confirm_delete.html
(DeleteView)
-
5. Anpassen von Create/Update/DeleteView
5.1 Feingranulare Formularsteuerung mit form_class
class PostCreateView(CreateView):
model = Post
form_class = PostForm # Definiere ModelForm
...
Mit PostForm
können Sie Feldvalidierungen oder Widgets festlegen, um flexiblere Formularverarbeitungen zu ermöglichen.
5.2 Dynamische Umleitung mit get_success_url()
def get_success_url(self):
# z.B.: Navigation zur Detailseite des neu erstellten Posts mithilfe von pk
return reverse_lazy('post_detail', kwargs={'pk': self.object.pk})
self.object
zeigt auf die aktuell in der Create/Update-Verarbeitung behandelte Modellinstanz.
5.3 Zugriffskontrolle, Mixin hinzufügen
-
In Kombination mit LoginRequiredMixin können Sie die Bearbeitungen nur für „angemeldete Benutzer“ verfügbar machen.
-
Wenn Sie die Berechtigungen spezifischer verwalten möchten, sollten Sie auch PermissionRequiredMixin oder UserPassesTestMixin in Betracht ziehen.
6. Vergleich mit FBV
Funktion | FBV (funktionale basierte Ansichten) | Create/Update/DeleteView (klassenbasierte Ansichten) |
---|---|---|
Erstellung (Create) | request.method == 'POST' Bedingung, ModelForm direkt definieren, Speichermethoden implementieren |
CreateView: Nur Vererbung, Formularerstellung→Speichern→Umleiten wird automatisch behandelt |
Aktualisierung (Update) | Vorhandenes Objekt abrufen und ins Formular einfügen, bei POST-Verarbeitung wieder Validierung und Speicherlogik | UpdateView: Vorhandenes Objekt holen→Aktualisieren→Speichern, Logik automatisiert |
Löschung (Delete) | GET→Löschbestätigungsseite rendern, POST→Löschung verarbeiten, Umleitung usw. alle Logik in einer Funktion gemischt | DeleteView: Löschen des Zielobjekts, Umleitung nach der Löschung, alles in eingebauter Logik |
Lesbarkeit / Wartbarkeit | Logikverzweigungen, die leicht zu langen Codes führen können und ähnliche Logik an verschiedenen Stellen wiederholt wird | Methoden-Überschreibung ermöglicht nur erforderliche Teile neu zu definieren, minimiert duplizierten Code |
Entwicklungseffizienz (Schlüsselworte) | „Hoher manueller Aufwand, Zeitraubend, Code-Duplikation“ | „Steigerung der Entwicklungsgeschwindigkeit (Zeitersparnis) und Verbesserung der Wartungsfreundlichkeit (Produktivitätssteigerung)” |
7. Fazit: Lassen Sie uns CRUD schnell und sauber mit generischen Ansichten implementieren!
Mit CreateView, UpdateView und DeleteView können Sie die CRUD-Operationen in Django extrem klar und intuitiv umsetzen.
Insbesondere werden Muster wie duplizierte Formularverarbeitung oder Umleitung nach Datenspeicherung automatisch behandelt, sodass der Entwickler sich auf „Geschäftslogik“ und „UI/UX“ konzentrieren kann.
Wenn Sie nun
ListView
+DetailView
+CreateView
+UpdateView
+DeleteView
vollständig verstehen, können Sie in Django problemlos eine grundlegende CRUD-Anwendung zusammensetzen!
Im nächsten Beitrag werden wir TemplateView & RedirectView vorstellen und sehen, wie man einfache Seiten mit automatisierter Umleitungen nahtlos umsetzt.
Frühere Beiträge ansehen
„Nutzen Sie die generischen Ansichten von Django, um die CRUD-Implementierung zu automatisieren und gleichzeitig die Entwicklungs- und Codequalität zu steigern!“
Es sind keine Kommentare vorhanden.