우리는 장고에서 오른쪽에 나타나는 list filter를 custom하게 만들고 싶습니다. 예를 들어, ㄱㄴㄷ 순으로 본다던지. 이러한 경우, 우리는 custom하게 필터를 줄 수 있는데요. 그 방법에 대해 알아보겠습니다.

 


 먼저 admin의 SimpleListFilter를 override합니다. 저는 유저 이름을 가지고 필터를 만들 것이니, class 이름은 UserNameFilter로 하겠습니다.

 

 title과 paramter_name은 각각 "username", "username"으로 하였는데요. 이 둘의 역할은 추후에 설명하겠습니다. 여기에서는 2개의 함수를 override를 할 것인데요. lookups와 queryset 이 둘을 override 할 겁니다.

 

 

 먼저, lookups는 필터에 어느 값이 출력될 것인지를 보여줍니다. 저는 간단하게 소문자 'a'부터 'z'까지만 출력되게 하였습니다.

 

 

 다음에, queryset인데요. self.value()가 있으면, filter를 추가로 건다는 것을 알 수 있어요. 여기서, user__username__startswith로, 이름이 'a'로 시작하는 유저들이 쓴 글, 'b'로 시작하는 유저들이 쓴 글, ... 이런 식으로 필터를 걸 수 있어요.

 

 

 그러면 이 value가 뭘까요? request's query string에서 제공하는 무언가인데요. parameter_name이 "username"이였습니다. 어드민 페이지에서 필터를 걸 때 /?a=b 이런 식으로 필터가 걸리는데요. 이 때 파라미터 a는 b이다. 라는 정보가 들어옵니다. 유저 이름이 파라미터 명이였고, 정보가 있다면, /?username=a 이런 식으로 들어올 겁니다.

 

 만약에, 그러한 것이 제공되지 않으면 None이 떨어집니다. 이 경우에는 filtering을 걸 이유가 전혀 없습니다. 그래서 self.value()가 있을 때에만 필터를 걸었고, 그렇지 않으면 그냥 깡 queryset을 돌려준 것입니다.

 

 

 이제 우리가 정의한 UserNameFilter를 list_filter에 추가하겠습니다.

 


 어드민 페이지의 post 목록에 들어가 보시면, created랑, By username이 있습니다. 여기서 username은 UserNameFilter의 제목, 즉 title이라고 할 수 있습니다. 그래서, By username이라고 뜬 것입니다. a, b, c, d, e, ... 이런 식으로 리스트가 걸리는데요. a와 A로 시작하는 유저들을 만들어 놓고 포스트를 몇 개 써 보았습니다.

 

 그리고 a를 클릭했습니다. 그랬더니, "Abcde"가 쓴 글과 "abcde"가 쓴 글. 이렇게 2개가 나왔습니다.

 

 

 다시, c를 클릭해 보았습니다. 그랬더니, 이번에는 c로 시작하는 "chokw", "chokw1"이 쓴 글 4개가 나왔습니다.

 

 

 반면, b를 클릭했을 때에는 아무것도 없음을 확인할 수 있습니다. 주소를 보면 위에 ?username=b가 있는데요. query 파라미터로 username이 주어졌고, 이 값이 b였다는 의미입니다.