우리는 장고에서 오른쪽에 나타나는 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였다는 의미입니다.
'웹 > 장고' 카테고리의 다른 글
django apps get_model이 무엇을 하는 함수인지 알아봅시다. (0) | 2022.11.17 |
---|---|
django custom admin 페이지로 user admin을 override 하는 방법을 알아봅시다. (0) | 2022.11.15 |
django admin의 list_filter를 알아보고 간단하게 적용해 봅시다. (0) | 2022.11.12 |
django search_fields에 대해 예제와 함께 알아봅시다. (0) | 2022.11.07 |
django에서 많은 데이터를 한꺼번에 추가할 때 쓰는 bulk_create를 알아봅시다. (0) | 2022.10.06 |
최근댓글