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 im form_valid() neue Objekte zu speichern und bei Erfolg auf eine URL weiterzuleiten.

  • Gut in Kombination mit dem ModelForm: Wenn Sie die model-Eigenschaft und fields oder form_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 von fields verwenden, können Sie ein ModelForm in forms.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

CRUD-Diagramm – 4 Aktionen, 5 Ansichten

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)”

FBV vs CBV – Möbelvergleich


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

  1. Erkundung der klassenbasierten Ansichten (CBV) Serie #1 – Der Grund für den Wechsel von FBV zu CBV und die Einstellung von Entwicklern

  2. Erkundung der klassenbasierten Ansichten (CBV) Serie #2 – Verständnis der grundlegenden View-Klasse in Django

  3. Erkundung der klassenbasierten Ansichten (CBV) Serie #3 – FormView zur einfachen Formularverarbeitung

  4. Erkundung der klassenbasierten Ansichten (CBV) Serie #4 – Nutzung von ListView & DetailView


„Nutzen Sie die generischen Ansichten von Django, um die CRUD-Implementierung zu automatisieren und gleichzeitig die Entwicklungs- und Codequalität zu steigern!“