Düzenleme Yalnızca İlan Sahibine Ait
Coddy'nin Django Journey'sinin Sınıf Tabanlı Görünümler bölümünün bir parçası. Ders 16 / 18.
grace olarak oturum açıp /jobs/python-developer-brightline/edit/ adresini aç: bu ilanı ada yayınladı ve grace onu değiştirebilir. İlan sayfalarında Edit yalnızca ilanı yayınlayana gösterilir; ancak herkes adresi yazabilir veya bir POST isteği gönderebilir, bu yüzden görünümün kendisi isteği reddetmelidir.
UserPassesTestMixin, görünüm çalışmadan önce yazdığın test_func() adlı yöntemi çağırır. True isteğin geçmesine izin verir; False, GET ve POST isteklerinin ikisinde de oturum açmış kullanıcıya 403 Forbidden yanıtı verir. Bir tarif sitesi, yayımlanmış bir tarifi kimsenin değiştirmesine izin vermez:
class RecipeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Recipe
fields = ["title", "minutes"]
def test_func(self):
return not self.get_object().publishedTest, görünüm satırı veritabanından almadan önce çalışır; bu nedenle self.object henüz mevcut değildir. self.get_object(), görünümün yapacağı gibi URL'deki satırı bulur.
Görev
OrtaBir işi yalnızca ilanı veren kişi düzenleyebilir veya silebilir:
LoginRequiredMixinöğesinden sonraJobUpdateViewveJobDeleteViewsınıflarınaUserPassesTestMixinekleyin.- Test yalnızca işi ilan eden kullanıcı için başarılı olur. Diğer herkes GET ve POST isteklerinde
403 Forbiddenyanıtı alır.
Run düğmesine basın, grace olarak oturum açın ve yukarıdaki düzenleme sayfasını açın.
Kendin dene
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")
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Sınıf Tabanlı Görünümler bölümündeki tüm dersler
4Düzenleme Görünümleri
Oluşturma GörünümüYeni İş İlanına GeçişKendi başına pratik yap: Django playground