• Django Admin 커스텀 레인지 필터 추가하기

    2021. 7. 7.

    by. Jacob Lee

    728x90


     

    장고 어드민 선택한 날짜 별 보기

    기존에 가입했던 유저의 날짜를 보기위한 필터로 다음과 같이 장고 어드민을 사용했었다.

    class UserAdmin(BaseUserAdmin, ExportCsvMixin):
        list_filter = ('date_joined', 'is_active')

     

    하지만 커스텀 날짜를 설정해서 지정한 날짜 사이에 유저를 확인할 수 있으면 좋을 것 같다는 의견이 들어와서 찾아보니 이 부분을 손 쉽게 해결해주는 라이브러리가 있어 적용해 보았다.

     

    Django-admin-rangefilter

    django-admin-rangefilter라는 라이브러리를 사용하면 쉽게 커스텀 가능한 날짜 레인지필터를 추가할 수 있다!

     

    라이브러리 설치와 적용

    먼저 다음과 같이 라이브러리를 설치하고 장고에서 앱 추가를 해준다.

    # 라이브러리 설치
    pip install django-admin-rangefilter
    
    # 장고 앱 추가
    INSTALLED_APPS = (
        ...
        'rangefilter',
        ...
    )

     

    어드민 코드를 다음과 같이 수정해 준다.

    나는 created_at이 아닌 필드의 생성 시기를 date_joined라는 필드로 사용하고 있어 다음과 같이 추가했다.

    from django.contrib import admin
    from rangefilter.filters import DateRangeFilter, DateTimeRangeFilter
    
    from .models import User
    
    
    class UserAdmin(BaseUserAdmin, ExportCsvMixin):
        list_filter = (
            ('date_joined', DateRangeFilter), 'is_active'
        )

     

    이렇게 간단한 필터만 추가해주면 다음과 같은 결과를 얻을 수 있다.

    특정 날짜 선택
    쿼리를 날리는 방식

     

    그 외 커스텀

    나는 간단히 적용했지만 공식 문서를 참고하면 다음과 같은 커스텀도 더 가능하다.

    from django.contrib import admin
    from rangefilter.filters import DateRangeFilter, DateTimeRangeFilter
    
    from .models import Post
    
    
    @admin.register(Post)
    class PostAdmin(admin.ModelAdmin):
        list_filter = (
            ('created_at', DateRangeFilter), ('updated_at', DateTimeRangeFilter),
        )
    
        # If you would like to add a default range filter
        # method pattern "get_rangefilter_{field_name}_default"
        def get_rangefilter_created_at_default(self, request):
            return (datetime.date.today, datetime.date.today)
    
        # If you would like to change a title range filter
        # method pattern "get_rangefilter_{field_name}_title"
        def get_rangefilter_created_at_title(self, request, field_path):
            return 'custom title'

     

    전&후 비교

     

    728x90

    댓글