Menu
CoddyTech

LoginRequiredMixin

Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 14 von 18.

Im Moment kann jeder ohne Konto eine Stelle veröffentlichen, bearbeiten oder löschen. Für eine Klasse gibt es keine einzelne Funktion, an die man @login_required setzen könnte, deshalb bietet Django dir ein Mixin: eine kleine Klasse, die du für ein zusätzliches Verhalten zu den Elternklassen einer View hinzufügst.

from django.contrib.auth.mixins import LoginRequiredMixin


class RecipeCreateView(LoginRequiredMixin, CreateView):
    model = Recipe
    fields = ["title", "minutes"]

Ein abgemeldeter Besucher wird jetzt zu /accounts/login/?next=/recipes/new/ weitergeleitet, bevor die View ausgeführt wird, sowohl bei GET als auch bei POST. Nach der Anmeldung bringt next ihn zurück.

Das Mixin kommt zuerst. Jede View beginnt in einer Methode namens dispatch(), und Python sucht von links nach rechts in den Elternklassen danach. Bei (CreateView, LoginRequiredMixin) hat die eigene dispatch()-Methode der View Vorrang, die Anmeldeprüfung wird nie ausgeführt und es gibt keine Warnung.

challenge icon

Aufgabe

Mittel

Nur angemeldete Benutzer dürfen Jobs veröffentlichen, bearbeiten oder löschen. Füge in jobs/views.py LoginRequiredMixin zu JobCreateView, JobUpdateView und JobDeleteView hinzu. Die Jobliste und die Jobseiten bleiben für alle zugänglich.

Klicke auf Post a job: Du landest auf der Anmeldeseite, wo sich ada mit coddy-pass-123 anmeldet.

Probier es selbst

from django.urls import reverse_lazy
from django.views.generic import CreateView, DeleteView, DetailView, ListView, TemplateView, UpdateView

from .models import Job


class HomeView(TemplateView):
    template_name = "jobs/home.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["count"] = Job.objects.count()
        context["latest"] = Job.objects.order_by("-posted").first()
        return context


class AboutView(TemplateView):
    template_name = "jobs/about.html"


class JobListView(ListView):
    model = Job
    context_object_name = "jobs"
    ordering = ["-posted"]
    paginate_by = 5

    def get_queryset(self):
        jobs = super().get_queryset()
        city = self.request.GET.get("city")
        if city:
            jobs = jobs.filter(city=city)
        return jobs


class JobDetailView(DetailView):
    model = Job


class JobCreateView(CreateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobUpdateView(UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobDeleteView(DeleteView):
    model = Job
    success_url = reverse_lazy("jobs:list")

Alle Lektionen in Klassenbasierte Views

Übe selbstständig: Django-Playground