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()가 우선 적용되고, 로그인 확인은 실행되지 않으며, 아무런 경고도 표시되지 않습니다.
챌린지
중급로그인한 사용자만 채용 공고를 게시하거나 수정하거나 삭제할 수 있습니다. 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 플레이그라운드