Menu
CoddyTech

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ç ve /jobs/python-developer-brightline/edit/ adresini aç: bu işi ada yayımladı ve grace işi değiştirebilir. İş sayfalarında Edit yalnızca ilanı yayımlayana gösterilir, ancak herkes adresi yazabilir veya 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() metodunu çağırır. True döndürdüğünde istek işleme alınır. False döndürdüğünde, oturum açmış bir kullanıcı GET ve POST isteklerinin ikisinde de 403 Yasak yanıtı alır. 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().published

Görünüm satırı aramadan önce test çalışır; bu yüzden self.object henüz mevcut değildir. self.get_object(), görünümün yapacağı gibi URL'den satırı bulur.

challenge icon

Görev

Orta

Bir işi yalnızca ilanı veren kişi düzenleyebilir veya silebilir. jobs/views.py dosyasında, LoginRequiredMixin’den sonra UserPassesTestMixin’i JobUpdateView ve JobDeleteView sınıflarına ekle. Test yalnızca işi ilan eden kullanıcı için başarılı olur; diğer herkes GET ve POST isteklerinde 403 Forbidden yanıtı alır.

grace (coddy-pass-123) olarak oturum aç ve /jobs/python-developer-brightline/edit/ adresini aç: ilanı ada verdiğinden 403 Forbidden görürsü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")
quiz iconKendini test et

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

Kendi başına pratik yap: Django playground