카테고리 없음
Django [관리자 페이지] admin.SimpleListFilter
nyanguk
2021. 2. 1. 23:48
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 )
...