게시자만 수정하기
Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 16번째.
grace로 로그인하고 /jobs/python-developer-brightline/edit/를 여세요. 해당 일자리는 ada가 게시했으며, grace는 수정할 수 있습니다. 일자리 페이지에는 게시자에게만 Edit가 표시되지만, 누구나 주소를 입력하거나 POST를 보낼 수 있으므로 뷰 자체에서 요청을 거부해야 합니다.
UserPassesTestMixin은 뷰가 실행되기 전에 직접 작성한 메서드인 test_func()를 호출합니다. 이 메서드가 True를 반환하면 요청이 통과합니다. False를 반환하면 로그인한 사용자에게 GET과 POST 모두 403 Forbidden 응답이 전달됩니다. 레시피 사이트에서는 게시된 레시피를 누구도 수정할 수 없도록 합니다.
class RecipeUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Recipe
fields = ["title", "minutes"]
def test_func(self):
return not self.get_object().published테스트는 뷰가 행을 조회하기 전에 실행되므로, 아직 self.object가 존재하지 않습니다. self.get_object()는 뷰가 조회할 방식과 마찬가지로 URL에서 행을 찾습니다.
챌린지
중급채용 공고를 게시한 사람만 해당 공고를 수정하거나 삭제할 수 있습니다. jobs/views.py에서 LoginRequiredMixin 다음에 UserPassesTestMixin을 JobUpdateView와 JobDeleteView에 추가하세요. 공고를 게시한 사용자만 테스트를 통과하며, 그 외의 사용자는 GET 및 POST 요청에서 403 Forbidden을 받습니다.
grace(coddy-pass-123)로 로그인하고 /jobs/python-developer-brightline/edit/를 여세요. ada가 공고를 게시했으므로 403 Forbidden이 표시됩니다.
직접 해보기
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")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
클래스 기반 뷰의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드