본문 바로가기
IT관련/Python

[django] list_filter를 이용해서 우리만의 필터링을 만들어보자 ! (feat. SimpleListFilter)

728x90

안녕하세요 !! 

 

오늘은 장고의 list_filter 대해서 알아보겠습니다 ! 

또한 리스트필터를 배우면서 우리만의 리스트필터를 만들어서 커스텀을 해봅시다 ^^

 

 

list_filter

장고에서 손쉽게 관리자 패널에서 filter을 기능으로 원하는 항목으로 필터링 해서 내용을 보여줍니다 ! 

또한 저희가 등록한 것에 대해서 손쉽게 커스텀 해서 필터링을 해줄수도 있어요 ! 

 

저는 일단 admin 패널에서는 아래와 같이 사용해줍시다 !  

list_filter이라고 간단하게 써주시면 ! admin 패널에서 손쉽게 필터링을 할 수 있는 기능이 생깁니다 !  

아래와 같이요 !!  저는 이미 몇가지 숫자를 등록해서 아래처럼 보입니다 ! 

이렇게 model에 등록한 것으로 손쉽게 할 수 있는데요 ! 

하지만 ! 저기서는 저희가 커스텀을 해서 foreign key로 등록한것들도 손쉽게 필터링이 가능하죠 ! 

 

아래처럼 장고의 마법을 부려서 외래키로 등록한 것에 대해서 __를 줘서 그 안에 항목들로도 필터링이 가능합니다 ! 

저는 user안에 is_host라는 컬럼도 추가 했으니 아래처럼 할 수 있죠 ^^ 

그러면 이렇게 나옵니다 !! 

 

 

자자 ! 그러면 여기서 메인으로 넘어갑시다 ! 

 

특별한 문구로 필터링 하자

자 ! 이런 문구로 어떻게 필터링이 가능할까요??? 

'Good', 'Greate', 'Wow'

저런식으로도 가능할까요???

 

물론 가능합니다 !!! SimpleListFIlter을 이용합시다 ! 

class WordFilter(admin.SimpleListFilter):
    
    title = "Filter by Words!"	# 1
    
    parameter_name = "word"	# 2
    
    def lookups(self, request, model_admin):	# 3
        return [
            ("good", "Good"),
            ("greate", "Greate"),
            ("wow", "Wow"),
        ]
    
    def queryset(self, request, reviews):	# 4
        word = self.value()
        if word:
            return reviews.filter(payload__contains=word)
        else:
            reviews

이런식으로 가능합니다 !!! 

먼저 여기서 가장 필수적인게 !  1,2,3,4 입니다 !!! 꼭 필수입니다 ! 

일단 admin 화면부터 봐봅시다 ! 바로 이해가 갑니다 ^^ 

 

밑에 처럼 나옵니다 !!!! 

 

아직 여기만 보면 잘 모르겠죠??? 

그럼 저기 옆에 새로생긴것을 한번 눌러봅시다 !!! 그러면 URL이 바뀌는것을 볼 수 있습니다 ! 

위에처럼 나옵니다 !!! 

그럼 위에서는 어떻게 반영 됐는지 봐볼까요??? 

 

바로 아래와 같이 알 수 있습니다.

코드상에서 title부분은 「Filter by Words!」 
parameter_name 부분이 ! URL에서 word입니다 !! 
lookupslisttouple으로 return해야합니다 ! 그리고 ('url에 보여지는 값', 'filter에 보여지는 값') 이 됩니다 ! 
즉 ! 위에서 보시면 ('wow', 'Wow') 부분이 있는데 wowurl으로 갔으며 Wow오른쪽 filter에 표시가 됐습니다!
마지막으로 queryset부분인데요 ! 여기선 url에서 받아온 값으로 저희가 filter를 해서 값을 반환해줬습니다 

 

이렇게 SimpleListFilter을 이용해서 저희가 원하는 방향으로 filtering을 하는 법을 배워봤습니다 !!! 

정말 많은 곳에서 응용을 할 수 있으니 

자신의 사이트에 맞게 운용해서 사용해봅시다 ^^ 

 

TIP으로 ! 밑에처럼 별점 몇개이상, 이하도 필터링을 할 수 있어요 !!! ㅎㅎ 

그럼 오늘도 즐코딩합시다 ! 

 

 

728x90