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.
Aufgabe
MittelNur 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
4Ansichten bearbeiten
CreateViewAuf der neuen Stelle landenÜbe selbstständig: Django-Playground