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. Jobseiten zeigen Edit nur der Person, die den Job veröffentlicht hat. Aber jeder kann die Adresse eingeben oder eine POST-Anfrage senden, also muss die View selbst den Zugriff verweigern.
UserPassesTestMixin ruft eine Methode auf, die du schreibst: test_func(), bevor die View ausgeführt wird. True lässt die Anfrage durch; False antwortet einem angemeldeten Benutzer mit 403 Forbidden, sowohl bei GET als auch bei POST. Eine Rezept-Website lässt niemanden ein veröffentlichtes Rezept ändern:
class RecipeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Recipe
fields = ["title", "minutes"]
def test_func(self):
return not self.get_object().publishedDie Prüfung 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
UserPassesTestMixinnachLoginRequiredMixinzuJobUpdateViewundJobDeleteViewhinzu. - Der Test ist nur für den Benutzer erfolgreich, der die Stelle veröffentlicht hat. Alle anderen erhalten bei GET und POST
403 Forbidden.
Klicke auf „Run“, melde dich als grace an und öffne die oben genannte Bearbeitungsseite.
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