Menu
CoddyTech

게시자만 수정하기

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

challenge icon

챌린지

중급

채용 공고를 게시한 사람만 수정하거나 삭제할 수 있습니다:

  • 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")
quiz icon실력 점검

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

클래스 기반 뷰의 모든 레슨

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