Menu
CoddyTech

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().published

Der 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.

challenge icon

Aufgabe

Mittel

Nur 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")
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Klassenbasierte Views

Übe selbstständig: Django-Playground