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().publishedTest 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.
Wyzwanie
ŚredniTylko osoba, która dodała ogłoszenie o pracę, może je edytować lub usunąć:
- Dodaj
UserPassesTestMixindoJobUpdateViewiJobDeleteView, poLoginRequiredMixin. - Test przechodzi tylko w przypadku użytkownika, który dodał ogłoszenie o pracę. Każda inna osoba otrzyma
403 Forbiddenprzy żą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")
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