안녕하세요. 이번 시간에는 django admin의 list_filter에 대해 간단하게 알아보고, range filter를 적용하는 방법도 같이 알아볼까 합니다.

 


 먼저, list_filter는 오른쪽에 FILTER로 나오는 것을 의미해요. post 모델에 대해서, "user"로 필터를 걸어보겠습니다.

 

 

 그러면, admin의 post view 페이지에서 FILTER 부분은 chokw, chokw1이 나오게 되는데요. post에서 user는 auth.user를 참조하는 외래키입니다. chokw1을 선택했을 때, 어떻게 쿼리가 날라가는지 보겠습니다.

 

 

 user__id__exact=2로 날라갑니다. foreign key의 id값과 일치하는 것일까요?

 

 chokw1이라는 username을 가진 유저는 id가 2네요. 일치함을 확인할 수 있습니다. 이렇게 list_filter를 걸면 대응되는 값들을 모두 선택할 수 있게끔 할 수 있어요. 일단, user의 경우, chokw, chokw1, .... 등 많은 유저가 나올 수 있으니, 깡으로 적용하기에는 적합하지 않아 보이긴 하네요. 이건 다음에 이야기 해 보도록 합시다.

 

 유저 이름이 'a'로 시작하는 유저들, 'b'로 시작하는 유저들, ... 등으로 custom list filter를 거는 방법을 추후에 소개드리겠습니다. 지금은 아. 그냥 list_filter가 가능한 값들 목록을 보여주고 해당 값을 선택하면, 필터가 걸리는 구나. 정도만 짚고 넘어가셔도 무난할 듯 합니다.

 


 우리는 관리자가 쓴 글과, 아닌 글만을 선택해서 filtering 하게끔 하고 싶습니다. 어떻게 하면 될까요? user 필드를 보면, staff status 라는 것이 있습니다. 이것은 장고에서 관리자 (staff)인지 아닌지를 구분합니다.

 

 

 해당 역할을 하는 것은 auth_user의 is_staff 입니다. BOOL이기 때문에 예, 아니오로만 답할 수 있습니다. 선택지가 2가지밖에 없으니, 그냥 선택 filter로 가져와도 무난하겠군요. 그렇기 때문에, is_staff 필드를 가지고 오면 됩니다.

 

 user__is_staff는 작성자가 staff인지 여부를 불러옵니다. 결과를 보도록 하겠습니다.

 

 is_staff__exact=0인 경우, 관리자가 아닙니다. chokw1은 관리자가 아니므로, chokw1이 작성한 글만 불러옵니다.

 


 그런데, 장고에서는 range filter query를 날리는 경우도 생각보다 많습니다. 예를 들자면 11월 8일부터 11월 10일 사이에 쓴 글을 검색한다던지, 조회수가 10000 이상인 글을 검색한다던지, 추천수가 5 이상인 것을 검색하는 것이 이에 속합니다. 당연하게도 이를 손쉽게 하게 해 주는 django-admin-rangefilter라는 것이 있는데요. 링크로 들어가면, 어떻게 세팅해야 하는지가 상세히 나와 있습니다.

 

 

 먼저, django-admin-rangefilter를 설치합시다.

 

 

 다음에, settings.py에 "rangefilter"를 추가하겠습니다.

 

 

 그리고, rangefilter.filter의 DateRangeFilter를 import 합시다. list_filter에는 ("created", DateRangeFitler)를 입력하겠습니다. 이는, Post의 "created" 필드를 DateRangeFilter를 이용해서, 오른쪽 FILTER에 보여주겠다는 의미입니다.

 

 적용해 보면, 오른쪽에, created에 대한 필터가 적용되었음을 볼 수 있어요.

 

 

 달력을 눌러보면, 이렇게 달력이 뜹니다. 상당히 편하니 알아두면 나쁘지 않습니다.

 

 

 수 범위 쿼리도 상당히 많이 쓰는데요. view라는 integer field를 추가한 다음에 migration을 하였습니다. 그리고 필드 view에 대해 NumericRangeFilter를 적용해 주면 위와 같은 화면을 볼 수 있습니다.