[Django] admin에서 list_filter에 넣을 커스텀 필터를 만들 수 있을까?
글 작성자: caputdraconis
반응형
현재 django admin에서는 Model Admin에 list_filter로 해당 모델의 필드 이름을 넣으면, 아래와 같이 필터링 기능을 제공합니다.
하지만 조금 색다른 필터링 기능을 구현하고 싶다면..? 커스텀 필터를 구현하면 됩니다!
간단하게 모델을 아래와 같이 만들어줍니다.
class TestModel(models.Model):
id = models.AutoField() # pk
order = models.IntegerField() # 사용자에게 몇 번째로 디스플레이 될지를 나타내는 필드(order==0이면 첫번째로 사용자에게 디스플레이 됩니다.)
title = models.TextField() # TestModel의 제목을 저장하는 필드
createdat = models.DateTimeField(default=timezone.now) # 해당 모델의 오브젝트가 생성된 일자를 저장할 필드
test1 = TestModel.objects.create(title='첫번째!', order=0)
test2 = TestModel.objects.create(title='두번째!', order=1)
test3 = TestModel.objects.create(title='세번째!', order=2)
test4 = TestModel.objects.create(title='네번째!', order=3)
test5 = TestModel.objects.create(title='사용자에게 보여지지 않은 오브젝트', order=-1)
test1.save()
test2.save()
test3.save()
test4.save()
test5.save()
TestModel.order는 주석으로 작성된 것과 같이 사용자에게 디스플레이 되는 순서를 의미합니다.
만약 아래와 같이 4개의 TestModel 오브젝트가 저장된다면, test5를 제외한 다른 모델들은 위에서부터 하나하나 순서대로 사용자에게 디스플레이 되게 됩니다.
만약 django admin에서 사용자에게 보여질 오브젝트(order >= 0)와 사용자에게 보여지지 않을 오브젝트(order < 0)를 기준으로 필터링을 하고 싶다면..? 이때 필요한게 커스텀 필터링입니다!
아래와 같이 작성하면 가능합니다.
from django.contrib.admin import SimpleListFilter
class TestModelCustomFiltering(SimpleListFilter):
title = "Displaying / Dropped" # 필터링 이름을 여기서 정해줍니다!
parameter_name = "pages" # 여기는 아무거나~
def lookups(self, request, model_admin):
# filter option을 정해주는 메소드입니다.
return [
("displaying", "보여지는 오브젝트"),
("dropped", "보여지지 않는 오브젝트"),
]
def queryset(self, request, queryset):
if self.value() == "dropped":
return queryset.distinct().filter(order__lt=0)
if self.value():
return queryset.distinct().filter(order__gte=0)
class TestModelAdmin(admin.ModelAdmin):
list_filter = [TestModelCustomFiltering, ]
반응형
댓글
이 글 공유하기
다른 글
-
[Django] admin edit view에 테이블을 추가하고 싶을땐?
[Django] admin edit view에 테이블을 추가하고 싶을땐?
2022.07.09 -
[Django] DjangoAdmin.SearchFields에 ChoiceField가 필요했어
[Django] DjangoAdmin.SearchFields에 ChoiceField가 필요했어
2022.06.11 -
[Django] 프로젝트에 toast-ui-editor 적용하기(django admin)
[Django] 프로젝트에 toast-ui-editor 적용하기(django admin)
2022.06.10 -
[Django] Django 프로젝트 중 맞닥뜨린 높은 벽들
[Django] Django 프로젝트 중 맞닥뜨린 높은 벽들
2022.05.24