Nur der Ersteller kann bearbeiten
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 16 von 18.
Melde dich als grace an und öffne /jobs/python-developer-brightline/edit/: ada hat diesen Job veröffentlicht, und grace kann ihn ändern. Auf Jobseiten wird „Bearbeiten“ nur der Person angezeigt, die den Job veröffentlicht hat. Aber jede Person kann die Adresse eingeben oder eine POST-Anfrage senden, deshalb muss die View selbst den Zugriff verweigern.
UserPassesTestMixin ruft vor der Ausführung der View eine Methode auf, die du schreibst: test_func(). Wenn sie True zurückgibt, wird die Anfrage verarbeitet. Wenn sie False zurückgibt, erhält ein angemeldeter Benutzer eine 403 Zugriff verweigert-Antwort, sowohl bei GET- als auch bei POST-Anfragen. Auf einer Rezeptseite kann niemand ein veröffentlichtes Rezept ändern:
class RecipeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Recipe
fields = ["title", "minutes"]
def test_func(self):
return not self.get_object().publishedDer Test wird ausgeführt, bevor die View den Datensatz abgerufen hat, daher existiert self.object noch nicht. self.get_object() findet den Datensatz anhand der URL, so wie es auch die View tun wird.
Aufgabe
MittelNur die Person, die eine Stelle veröffentlicht hat, darf sie bearbeiten oder löschen. Füge in jobs/views.py UserPassesTestMixin nach LoginRequiredMixin zu JobUpdateView und JobDeleteView hinzu. Der Test ist nur für die Person erfolgreich, die die Stelle veröffentlicht hat; alle anderen erhalten bei GET und POST 403 Forbidden.
Melde dich als grace (coddy-pass-123) an und öffne /jobs/python-developer-brightline/edit/: ada hat die Stelle veröffentlicht, daher wird dir 403 Forbidden angezeigt.
Probier es selbst
from django.contrib.auth.mixins import LoginRequiredMixin
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(LoginRequiredMixin, CreateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
def form_valid(self, form):
form.instance.posted_by = self.request.user
return super().form_valid(form)
class JobUpdateView(LoginRequiredMixin, UpdateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
class JobDeleteView(LoginRequiredMixin, DeleteView):
model = Job
success_url = reverse_lazy("jobs:list")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Klassenbasierte Views
4Ansichten bearbeiten
CreateViewAuf der neuen Stelle landenÜbe selbstständig: Django-Playground