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()가 우선되어 로그인 검사가 실행되지 않으며, 아무런 경고도 표시되지 않습니다.
챌린지
중급로그인한 사용자만 채용 공고를 등록, 수정 또는 삭제할 수 있습니다:
JobCreateView,JobUpdateView및JobDeleteView에LoginRequiredMixin을 추가하세요.- 채용 공고 목록과 공고 페이지는 누구나 계속 볼 수 있습니다.
Run을 누른 다음 Post a job을 누르세요. 로그인 페이지로 이동합니다. 비밀번호 coddy-pass-123를 사용해 ada로 로그인하세요.
직접 해보기
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 플레이그라운드