Menu
CoddyTech

LoginRequiredMixin

Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 14번째.

현재는 누구나 계정 없이도 작업을 게시, 수정 또는 삭제할 수 있습니다. 클래스에는 @login_required를 적용할 단일 함수가 없으므로, Django는 믹스인을 제공합니다. 믹스인은 뷰의 부모 클래스에 추가하여 동작을 하나 더하는 작은 클래스입니다.

from django.contrib.auth.mixins import LoginRequiredMixin


class RecipeCreateView(LoginRequiredMixin, CreateView):
    model = Recipe
    fields = ["title", "minutes"]

이제 로그아웃한 방문자는 GET과 POST 요청 모두에서 뷰가 실행되기 전에 /accounts/login/?next=/recipes/new/로 이동합니다. 로그인한 뒤에는 next가 원래 위치로 돌려보냅니다.

믹스인은 첫 번째에 와야 합니다. 모든 뷰는 dispatch()라는 메서드에서 시작하며, Python은 왼쪽에서 오른쪽 순서로 부모 클래스에서 이 메서드를 찾습니다. (CreateView, LoginRequiredMixin)으로 작성하면 뷰 자체의 dispatch()가 우선 적용되고, 로그인 확인은 실행되지 않으며, 아무런 경고도 표시되지 않습니다.

challenge icon

챌린지

중급

로그인한 사용자만 채용 공고를 게시하거나 수정하거나 삭제할 수 있습니다. jobs/views.py에서 JobCreateView, JobUpdateView 및 JobDeleteView에 LoginRequiredMixin을 추가하세요. 채용 공고 목록과 채용 공고 페이지는 모두에게 계속 공개됩니다.

Post a job을 누르면 로그인 페이지로 이동하며, 여기서 ada가 coddy-pass-123로 로그인합니다.

직접 해보기

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(CreateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobUpdateView(UpdateView):
    model = Job
    fields = ["title", "company", "city", "salary", "description"]


class JobDeleteView(DeleteView):
    model = Job
    success_url = reverse_lazy("jobs:list")

클래스 기반 뷰의 모든 레슨

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