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.
Aufgabe
MittelNur angemeldete Benutzer dürfen Stellenanzeigen veröffentlichen, bearbeiten oder löschen:
- Füge
LoginRequiredMixinzuJobCreateView,JobUpdateViewundJobDeleteViewhinzu. - 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
4Ansichten bearbeiten
CreateViewAuf der neuen Stelle landenÜbe selbstständig: Django-Playground