노마드 코더 Airbnb 클론 코딩

노마드 코더 에어비앤비 클론 코딩 #8 Power Admin

gogi masidda 2022. 10. 21. 22:40

Methods

admins.py와 models.py 모두에 function을 정의할 수 있다. 

만약 오직 관리자 페이지에서만 function을 사용할 것이라면, admins.py에 정의한다.

만약 관리자 페이지 뿐만 아니라 다른 곳에서도 사용할 것이라면, models.py에 정의한다.

 

Method 만들기

클래스 안에 있는 메서드는 항상 self를 첫번째 매개 변수로 받아야한다. 꼭 self라 할 필요는 없고, 단지 꼭 하나의 초기 매개 변수가 있으면 된다.

 

⭐'방 리뷰의 평균 보여주기' 메서드

우리의  Room 모델의 review 속성을 가지고 있지 않다. 하지만, review 모델이 room을 가리키므로 Room에서 그 방을 가리키는 모든 review들에 접근할 수 있다.

def rating(room):
	count = room.reviews.count()
    if count = 0:
    	return "No Reviews"
    else:
    	total_rating = 0
        for review in room.reviews.all().values("rating") #review의 rating만 필요하므로 rating만 불러오기
        	total_rating += review['rating']
        return round(total_rating / count, 1)

Method 함수 정의
Method가 적용된 어드민 패널

Search Fields

https://docs.djangoproject.com/en/4.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields

 

The Django admin site | Django documentation | Django

Django The web framework for perfectionists with deadlines. Toggle theme (current theme: auto) Toggle theme (current theme: light) Toggle theme (current theme: dark) Toggle Light / Dark / Auto color theme Overview Download Documentation News Community Code

docs.djangoproject.com

 

Admin Actions

#admin.py

#admin 클래스 밖에
@admin.action(description="...")
def 함수명(액션을 호출하는 클래스, 요청한 user정보, 선택한 모든 객체의 리스트):
	함수 작성
    
#admin 클래스 안에
actions = (action1,action2,...)

클래스 밖 Admin Action 함수 정의
Action이 적용된 어드민 패널

 

Custom Filters

●ForeignKey로도 필터링이 가능(user__is_host처럼 __로 가능, 외래키의 외래키의 외래키... 도 가능)

 

●직접 필터 만들기

필터 코드는 admins.py가 아니라 별도의 파일에 있어도 된다. 하지만 admins.py에 import는 해주고 Admin 클래스에 적어주어야한다.

class 필터명(admin.SimpleListFilter):
	title = 어드민 패널에 뜨게할 이름
    
    parameter_name = url에 사용될 이름
    
    def lookup(self,request,model_admin):
    	return [("DB에서 사용될 이름","직접 보게되는 이름"), ....] #필터링할 것들
        
    def queryset(self,request,queryset):
    	return 필터링 후에 리턴할 것

Custom Filter 코드

위의 예시 코드에서, queryset함수에 'request.GET'을 프린트하면 단어의 쿼리 딕셔너리 {'word':['good']}을 프린트한다.(어드민 패널에서 Good으로 필터링했을 때)

우리는 필터링 시에 Good만 필요하므로 'word = self.value()'를 해주는 것이다.

 

if word:에서 리턴되는 review는 queryset이므로, .filter 등을 쓸 수 있다. 여기서는 .filter를 통해 'word'가 포함되는 리뷰를 리턴한다.

필터를 통해 Good이 들어간 리뷰를 찾음

 

728x90