Menu
CoddyTech

Edytuje tylko autor ogłoszenia

Część sekcji Widoki oparte na klasach ścieżki Django w Coddy. Lekcja 16 z 18.

Zaloguj się jako grace i otwórz /jobs/python-developer-brightline/edit/: to ada opublikowała tę ofertę pracy, a grace może ją zmienić. Na stronach ofert pracy opcja Edit jest widoczna tylko dla osoby, która opublikowała ofertę, ale każdy może wpisać adres lub wysłać żądanie POST, więc sam widok musi odmówić dostępu.

UserPassesTestMixin wywołuje napisaną przez ciebie metodę test_func() przed uruchomieniem widoku. True przepuszcza żądanie, a False zwraca zalogowanemu użytkownikowi odpowiedź 403 Forbidden zarówno dla GET, jak i POST. Witryna z przepisami nie pozwala nikomu zmieniać opublikowanego przepisu:

class RecipeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Recipe
    fields = ["title", "minutes"]

    def test_func(self):
        return not self.get_object().published

Test jest wykonywany, zanim widok wyszuka wiersz, więc self.object jeszcze nie istnieje. self.get_object() wyszukuje wiersz na podstawie adresu URL, tak jak zrobi to widok.

challenge icon

Wyzwanie

Średni

Tylko osoba, która dodała ogłoszenie o pracę, może je edytować lub usunąć:

  • Dodaj UserPassesTestMixin do JobUpdateView i JobDeleteView, po LoginRequiredMixin.
  • Test przechodzi tylko w przypadku użytkownika, który dodał ogłoszenie o pracę. Każda inna osoba otrzyma 403 Forbidden przy żądaniu GET i POST.

Naciśnij Run, zaloguj się jako grace i otwórz powyższą stronę edycji.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Widoki oparte na klasach

Poćwicz samodzielnie: Edytor online Django