from datetime import date
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
class DecadeBornListFilter(admin.SimpleListFilter):
title = _("decade born")
def lookups(self, request, model_admin):
return [
("80s", _("in the eighties")),
("90s", _("in the nineties")),
]
def queryset(self, request, queryset):
if self.value() == "80s":
return queryset.filter(
birthday__gte=date(1980, 1, 1),
birthday__lte=date(1989, 12, 31),
)
if self.value() == "90s":
return queryset.filter(
birthday__gte=date(1990, 1, 1),
birthday__lte=date(1999, 12, 31),
)
class PersonAdmin(admin.ModelAdmin):
list_filter = [DecadeBornListFilter]
- django admin패널에서 simplelist클래스를 상속받으면 위와 같은 형식으로 필터링이 가능하다.
- title : 리스트의 이름-어드민 패널에 나옴
- lookups : 필수로 작성해야 하는 함수. 무조건 self, request, model_admin을 순서대로 인자로 받아야한다. return 값은 무조건 list of tuple 형태. 튜플의 첫번째 인덱스는 param,두번째 인덱스는 필터의 분류(어드민 패널에 나온다)
- queryset : 필수. self, request, queryset을 인자로 받음. 보통 self.value()를 이용해서 필터링 로직을 작성한다. self.value()는 lookups 리턴값의 튜플의 첫번째 인덱스이다.
- 함수를 전부 작성했으면 list_filter에 추가 해준다.