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 bisa mengubahnya. Halaman lowongan hanya menampilkan Edit kepada orang yang mempostingnya, tetapi siapa pun bisa mengetik alamat atau mengirim POST, jadi view itu sendiri harus menolak permintaan.
UserPassesTestMixin memanggil method yang kamu tulis, test_func(), sebelum view dijalankan. True mengizinkan permintaan diteruskan; False memberikan respons 403 Forbidden kepada pengguna yang sudah login, 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().publishedPengujian berjalan sebelum view mencari barisnya, jadi self.object belum ada. self.get_object() mencari baris dari URL, seperti yang akan dilakukan view.
Tantangan
SedangHanya orang yang memasang lowongan kerja yang boleh mengedit atau menghapusnya:
- Tambahkan
UserPassesTestMixinkeJobUpdateViewdanJobDeleteView, setelahLoginRequiredMixin. - Pengujian hanya berhasil untuk pengguna yang memasang lowongan kerja tersebut. Pengguna lain akan mendapat
403 Forbidden, saat melakukan GET maupun POST.
Tekan Jalankan, masuk sebagai grace, lalu buka halaman edit di atas.
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")
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di View Berbasis Class
4Mengedit View
CreateViewMenuju Pekerjaan Baru2Tampilan Generik untuk Menampilkan Data
ListViewDetailViewLatihan sendiri: Playground Django