본문 바로가기
카테고리 없음

Django [관리자 페이지] admin.SimpleListFilter

by nyanguk 2021. 2. 1.

admin.py에서 list_filter를 통해 관리자 페이지 한 켠에 특정 필드를 기준으로 필터링 할 수 있는 창을 띄웠다. 아래는 Post 모델의 관리자 페이지이며 왼쪽의 FILTER부분에 list_filter를 사용하지 않는 방법으로 세부사항을 구현하고자 한다.

 

admin.SimpleListFilter를 사용해 필터 구현하기

admin.SimpleListFilter을 이용하여 filter의 요소를 추가 할 수 있다 title,parameter_name 변수와 lookups, queryset 메소드를 재정의 해야만 한다. 

 

  • title -  필터의 이름
  • parameter_name -필터에 사용될 컬럼의 이름(데이터베이스상에서 존재하는 이름이여야함)
  • lookups - 필터 창에서 보이게되는 것을 구현한 메소드
  • queryset - 필터 창에서 특정 필터를 선택(클릭)했을때의 동작방법을 구현한 메소드

 

admin.SimpleListFilter를 이용해 만들 필터들을 구현하기 위해 post에 filters.py 파일을 생성하고 아래 내용을 추가한다.

# Custom_admin/post/filters.py
from django.contrib import admin
import datetime
from post.models import Post

class CreatedDateFilter(admin.SimpleListFilter):
    title = '작성일'
    parameter_name = 'date'

    def lookups(self, request, model_admin):
        results = []    
        for i in range(-3, 6):
            date = datetime.date.today() + datetime.timedelta(days=i)
            display_str = '{0} [{1}개]'.format(
                date,
                Post.objects.filter(created_at__date=date).count()
            )   
            display_str += ' - 오늘' if i == 0 else ''
            results.append((date, display_str))
        return results

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(created_at__date=self.value())
        else:
            return queryset.all()

 

 

공식 문서를 살펴보면 return되는 값은 튜플로 구성된 리스트이며 첫번째 요소는 코드화된 url쿼리이고 두번째 요소는 사람이 읽기 쉬운 이름이다.

즉, queryset에서 첫번째 요소로 매핑된 self.value()를 사용하여 어떤 필터를 선택(클릭)했는지 알 수 있는 것이다.

 

 

구현한 필터 추가하기

모두 구현한 뒤에 해당 어플리케이션의 admin.py filters.py 모듈을 import 한뒤 list_filter의 요소로 filters.py에서 만든 CreatedDateFilter를 추가해준다.

아래 코드를 post 의  admin.py에 추가 해준다.

 

# Custom_admin/post/admin.py
from .filters import CreatedDateFilter

class PostAdmin(admin.ModelAdmin):
	...
    list_filter = (
    'member__permission',
    'category__name', 'is_deleted',CreatedDateFilter )
    ...