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

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

challenge icon

Aufgabe

Mittel

Nur die Person, die eine Stelle veröffentlicht hat, darf sie bearbeiten oder löschen:

  • Füge UserPassesTestMixin nach LoginRequiredMixin zu JobUpdateView und JobDeleteView hinzu.
  • 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")
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