Menu
CoddyTech

LoginRequiredMixin

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

Im Moment kann jeder ohne Konto einen Job veröffentlichen, bearbeiten oder löschen. Für eine Klasse gibt es keine einzelne Funktion, auf die man @login_required setzen kann, daher bietet Django ein Mixin: eine kleine Klasse, die du zu den Basisklassen einer View hinzufügst, um ein zusätzliches Verhalten zu erhalten.

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 dem Anmelden 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 Basisklassen danach. Wird (CreateView, LoginRequiredMixin) geschrieben, hat die eigene dispatch()-Methode der View Vorrang, die Anmeldeprüfung wird nie ausgeführt, und nichts weist dich darauf hin.

challenge icon

Aufgabe

Mittel

Nur angemeldete Benutzer dürfen Stellenanzeigen veröffentlichen, bearbeiten oder löschen:

  • Füge LoginRequiredMixin zu JobCreateView, JobUpdateView und JobDeleteView hinzu.
  • Die Stellenliste und die Stellenseiten bleiben für alle zugänglich.

Klicke auf „Run“ und dann auf Post a job: Du gelangst zur Anmeldeseite. Melde dich als ada mit dem Passwort coddy-pass-123 an.

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