Today I Learned/django

장고 (django) 클래스 기반 뷰에서 믹스인 사용하기 (mixin)

하나719 2023. 8. 29. 16:27
반응형

공식 문서: https://docs.djangoproject.com/en/4.1/topics/class-based-views/mixins/

 

Mixin 역할

재사용 가능한 기능을 클래스에 추가하여 코드를 모듈화 하고 뷰, 모델 등의 클래스에서 코드 중복을 줄이는데 사용된다.

클래스 기반 뷰에서 사용되며, 자주 사용되는 Mixin으로는 'LoginRequireMixin', 'PermissionRequireMixin', 'FormMixin' 등이 있다. 이러한 Mixin 클래스를 사용하여 로그인 요구사항, 권한 확인, 폼 처리등의 기능을 뷰에 추가할 수 있다. 

 

사용 예시

'LoginRequireMixin'

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView

class MyProtectedView(LoginRequiredMixin, TemplateView):
    template_name = 'my_template.html'

MyProtectedView 클래스는 LoginRequiredMixin과 TemplateView를 상속받아 생성되었다. 

LoginRequireMixin은 해당 뷰에 접근할 때 로그인이 필요하다는 것을 의미한다. 따라서 사용자가 로그인 하지 않은 경우 해당 뷰에 접근할 수 없다. 

 

Mixin만들고 사용해서 코드 중복 줄여보기

Login한 유저만 리스트를 확인, 수정, 삭제 할 수 있는 기능을 제공하고 싶다고 했을 때 로그인한 유저의 정보를 확인하는 쿼리셋을 해당 뷰에 모두 추가하지않고 Mixin으로 상속받아 코드 중복을 줄 일 수 있다. 

 

* 변경 전 ListView에 직접 queryset을 구현 

class ManageCourseListView(ListView):
    model = Course
    template_name = 'course/manage/course/list.html'

    def get_queryset(self):
        qs = super().get_queryset()
        return qs.filter(owner=self.request.user)

* 변경 후 Mixin 정의하여 클래스에서 상속 받아 사용 

1. OwnerMixin

로그인한 유저 정보가져오는 쿼리 셋 정의

2. OwnerCouseMixin(OwnerMixin)

위에 정의한 믹스인을 상속받고, model = Course 인 view 생성 

3. ManageCourseListView(OwnerCourseMixin, ListView)

위에 정의한 믹스인을 리스트뷰와 함께 상속하여 사용하며 기존 코드에서 아래 내용은 중복이므로 지워준다

  • model = Course
  • def get_queryset(self):

OwnerMixin을 최상위에 정의하여 Owner

class OwnerMixin:
    def get_queryset(self):
        qs = super().get_queryset()
        return qs.filter(owner=self.request.user)

class OwnerCourseMixin(OwnerMixin):
    model = Course 
    fields = ['subject', 'title','slug','overview']
    success_url = reverse_lazy('manage_course_list')

# 강좌를 생성, 편집, 삭제하기 위한 뷰 -> 생성자만 접근 할 수 있음
class ManageCourseListView(OwnerCourseMixin, ListView):
    template_name = 'course/manage/course/list.html'
반응형