Menu
CoddyTech

게시자만 수정하기

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에서 행을 찾습니다.

challenge icon

챌린지

중급

채용 공고를 게시한 사람만 해당 공고를 수정하거나 삭제할 수 있습니다. 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")
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

클래스 기반 뷰의 모든 레슨

직접 연습해 보세요: Django 플레이그라운드