Menu
CoddyTech

Hanya Pembuat Postingan yang Bisa Mengedit

Termasuk bagian View Berbasis Class dalam perjalanan Django di Coddy. Pelajaran 16 dari 18.

Masuk sebagai grace dan buka /jobs/python-developer-brightline/edit/: ada memposting lowongan itu, dan grace dapat mengubahnya. Halaman lowongan hanya menampilkan Edit kepada orang yang mempostingnya, tetapi siapa pun dapat mengetik alamat atau mengirim POST, jadi view itu sendiri harus menolak permintaan tersebut.

UserPassesTestMixin memanggil metode yang kamu tulis, test_func(), sebelum view dijalankan. Jika metode itu mengembalikan True, permintaan diteruskan. Jika metode itu mengembalikan False, pengguna yang sudah masuk akan menerima respons 403 Forbidden, baik untuk GET maupun POST. Situs resep tidak mengizinkan siapa pun mengubah resep yang sudah dipublikasikan:

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

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

Pengujian berjalan sebelum view mencari baris tersebut, jadi self.object belum ada. self.get_object() menemukan baris berdasarkan URL, seperti yang akan dilakukan view.

challenge icon

Tantangan

Sedang

Hanya orang yang memasang lowongan kerja yang boleh mengedit atau menghapusnya. Di jobs/views.py, tambahkan UserPassesTestMixin ke JobUpdateView dan JobDeleteView, setelah LoginRequiredMixin. Pemeriksaan hanya berhasil untuk pengguna yang memasang lowongan kerja tersebut, dan pengguna lain akan mendapat 403 Forbidden, baik saat GET maupun POST.

Masuk sebagai grace (coddy-pass-123) lalu buka /jobs/python-developer-brightline/edit/: ada yang memasangnya, jadi kamu akan melihat 403 Forbidden.

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di View Berbasis Class

Latihan sendiri: Playground Django