게시자만 수정하기
Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 16번째.
grace로 로그인하고 /jobs/python-developer-brightline/edit/을 여세요. 해당 일자리는 ada가 게시했으며, grace는 수정할 수 있습니다. 일자리 페이지에는 게시자에게만 Edit가 표시되지만, 누구나 주소를 입력하거나 POST 요청을 보낼 수 있으므로 뷰 자체에서 이를 거부해야 합니다.
UserPassesTestMixin은 뷰가 실행되기 전에 직접 작성한 메서드인 test_func()를 호출합니다. True이면 요청을 통과시키고, False이면 로그인한 사용자에게 GET과 POST 모두 403 접근 금지로 응답합니다. 레시피 사이트에서 게시된 레시피를 수정할 수 있는 사람은 아무도 없습니다.
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에서 해당 행을 찾습니다.
챌린지
중급채용 공고를 게시한 사람만 수정하거나 삭제할 수 있습니다:
LoginRequiredMixin뒤에UserPassesTestMixin을JobUpdateView와JobDeleteView에 추가합니다.- 공고를 게시한 사용자만 테스트를 통과합니다. 다른 사용자는 GET과 POST 요청 모두에서
403 Forbidden오류를 받습니다.
Run을 누르고 grace로 로그인한 다음 위의 수정 페이지를 엽니다.
직접 해보기
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 플레이그라운드