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ć. Strony ofert pracy pokazują opcję Edit tylko osobie, która opublikowała ofertę, ale każdy może wpisać ten 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. Gdy zwraca True, żądanie jest obsługiwane. Gdy zwraca False, zalogowany użytkownik otrzymuje odpowiedź 403 Forbidden, zarówno dla żądania GET, jak i POST. Serwis 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().publishedTest jest wykonywany, zanim widok wyszuka rekord, więc self.object jeszcze nie istnieje. self.get_object() znajduje rekord na podstawie adresu URL, tak jak zrobi to widok.
Wyzwanie
ŚredniTylko osoba, która opublikowała ofertę pracy, może ją edytować lub usunąć. W pliku jobs/views.py dodaj UserPassesTestMixin do JobUpdateView i JobDeleteView, za LoginRequiredMixin. Test przechodzi tylko w przypadku użytkownika, który opublikował ofertę pracy; wszyscy inni otrzymają 403 Forbidden przy żądaniu GET i POST.
Zaloguj się jako grace (coddy-pass-123) i otwórz /jobs/python-developer-brightline/edit/: ofertę opublikowała ada, więc zobaczysz 403 Forbidden.
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")
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
4Widoki edycji
CreateViewStrona nowego ogłoszenia o pracę2Generyczne widoki wyświetlania
ListViewDetailViewPoćwicz samodzielnie: Edytor online Django