Klasy widoków (CBV) w Django

Django pozwala tworzyć widoki na dwa sposoby:

  • FBV (Function-Based Views) – klasyczne widoki oparte na funkcjach.
  • CBV (Class-Based Views) – widoki oparte na klasach, które ułatwiają ponowne wykorzystanie kodu i rozszerzanie logiki.

1. Różnica między FBV a CBV

Function-Based Views (FBV)

  • Definiowane jako zwykłe funkcje w Pythonie.
  • Intuicyjne i szybkie do napisania dla prostych przypadków.
  • Mogą szybko stać się nieczytelne przy bardziej złożonej logice.

Przykład FBV:

post_list.html:

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <title>Lista postów</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 40px;
            background-color: #f9f9f9;
        }
        h1 {
            color: #333;
        }
        .post {
            background: #fff;
            border: 1px solid #ddd;
            border-radius: 10px;
            padding: 20px;
            margin-bottom: 20px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
        }
        .post h2 {
            margin-top: 0;
            color: #007acc;
        }
        .date {
            font-size: 0.9em;
            color: #777;
        }
    </style>
</head>
<body>
    <h1>Lista postów</h1>

    {% for post in posts %}
        <div class="post">
            <h2>{{ post.title }}</h2>
            <p class="date">Opublikowano: {{ post.published_date|date:"d.m.Y H:i" }}</p>
            <p>{{ post.content|truncatewords:30 }}</p>
        </div>
    {% empty %}
        <p>Brak postów do wyświetlenia.</p>
    {% endfor %}
</body>
</html>

urls.py:

urlpatterns = [
    path('', views.post_list, name='list'),  
]

Class-Based Views (CBV)

  • Definiowane jako klasy dziedziczące po View lub widokach generycznych.
  • Wykorzystują metody zamiast instrukcji warunkowych (get(), post(), put(), delete() itd.).
  • Bardziej elastyczne – łatwo rozszerzać i modyfikować logikę przez dziedziczenie i miksiny.

Przykład CBV:

urls.py:

urlpatterns = [
    path('list/', PostListView.as_view(), name='list'),
]

2. Generic Views (widoki generyczne)

Django dostarcza zestaw gotowych widoków, które znacznie przyspieszają implementację CRUD.

2.1. ListView – lista obiektów

Automatycznie pobiera wszystkie obiekty modelu i przekazuje do szablonu.


2.2. DetailView – szczegóły obiektu

Renderuje pojedynczy obiekt na podstawie pk lub slug.


2.3. CreateView – tworzenie obiektu

Automatycznie tworzy formularz do dodawania obiektów.


2.4. UpdateView – edycja obiektu

Formularz do edycji istniejących danych.


2.5. DeleteView – usuwanie obiektu

Wyświetla stronę potwierdzającą usunięcie i usuwa obiekt po POST.


3. Miksiny (Mixins)

Miksiny to klasy wielokrotnego dziedziczenia, które dodają do widoków określone funkcjonalności.

Najczęściej używane miksiny:

3.1. LoginRequiredMixin

Wymaga zalogowania użytkownika:


3.2. PermissionRequiredMixin

Wymaga posiadania określonego uprawnienia:


3.3. UserPassesTestMixin

Pozwala zdefiniować własny warunek dostępu: