06. Room Admin

조재훈·2022년 7월 18일
0

Clone_Airbnb

목록 보기
13/31
post-thumbnail

1) list_display
Room의 Admin에 보여줄 내용을 추가하자.
rooms - admin.py - RoomAdmin

class RoomAdmin(admin.ModelAdmin):

    """Room Admin Definition"""
    
    list_display = (
        "name",
        "country",
        "city",
        "price",
        "address",
        "guests",
        "beds",
        "bedrooms",
        "baths",
        "check_in",
        "check_out",
        "instant_book",
    )

Admin 패널에서 Room이 이쁘게 나온다.

2) list_filter
내용을 걸러낼 수 있는 필터를 추가하자
rooms - admin.py - RoomAdmin

    list_filter = ("instant_book", "city", "country")

3) search_fields
키워드를 입력해서 내용을 검색할 수 있게 하자
rooms - admin.py - RoomAdmin

    search_fields = ("city",)

admin 패널에 검색창이 생긴 것을 볼 수 있다.

검색을 해보면 잘 나온다

여기서 보면 대문자로 검색했는데도 소문자로 입력된 도시가 검색에 잡히는데, Django는 기본적으로 Search_fields에 icontains라는 설정을 가지고 있기 때문이다. icontains는 대소문자를 구분하지 않고 찾는 것이다.

다른 설정들을 사용할수도 있는데 예를 들어 startswith의 경우 search_fields에 입력하는 필드명 앞에 "^"를 붙여주면 된다. 단어의 시작되는 글자로 찾는 것이다.

    search_fields = ("^city",)

pole에서 뒷글자인 le로 검색하면 안나온다.

iexact라는 것도 있는데 검색하려는 대상의 철자를 정확하게 입력해야 한다. 대소문자는 상관없다.

    search_fields = ("=city",)

글자를 일부만 입력하면 안나온다.

전부 입력해야 한다

다른 필드를 추가해볼건데 만약 ForeignKey일 경우 변수명__필드 요소 형식으로 작성한다. (언더바 2개)

    search_fields = ("^host__username",)

주인장 이름을 검색하니 결과에 잡힌다

참고로 이 집 주인 이름은 tomato 이다.



자 이제 본격적으로 추가해보자. list_filter
    list_filter = (
        "instant_book",
        "host__superhost",
        "room_type",
        "amenities",
        "facilities",
        "house_rules",
        "city",
        "country",
    )

아직 내용이 없는 필드들은 내용을 추가하자.
Amenity에 몇가지를 추가했다.

Facility도 추가

House Rule도 추가

Room 화면을 보면 필터가 잘 적용되었다.

근데 우리는 이렇게 소수의 항목만 가지고 설정하진 않을 것이다.

filter_horizontal 이란걸 써보자. ManyToManyField에서 사용할 수 있는 필터다.

    filter_horizontal = (
        "amenities",
        "facilities",
        "house_rules",
    )

예쓰. 내용을 검색해서 추가할수도 있다.

그리고 admin 패널도 깔끔하게 보기 위해 fieldsets을 정리해주자

    fieldsets = (
        ("Basic Info", {"fields": ("name", "description", "country", "address", "price")}),
        ("Times", {"fields": ("check_in", "check_out", "instant_book")}),
        ("Spaces", {"fields": ("guests", "beds", "bedrooms", "baths")}),
        ("More About the Space", 
            {
                "classes": ("collapse",),
                "fields": ("amenities", "facilities", "house_rules"),
            },
        ),
        ("Last Details", {"fields": ("host",)}),
    )

중간에 "More About the Space" 부분에 보면 "classes": ("collapse",) 라는 부분이 있는데 해당 부분은 사용자가 볼때 패널이 접혀있는 것을 기본값으로 주는 것이다. 펼치면 아래와 같이 나타난다.

ordering 추가 (참고용)

    ordering = ("name", "price", "bedrooms")

해당 필드에 화살표가 생겼다.

ManyToManyField를 list_display에 추가할 경우 바로 되지가 않는다. 별도의 함수를 생성해줘야 함.
테스트용으로 하나 만들어보자

    list_display =("count_amenities",)
    
    def count_amenities(self, obj):
        return "Potato"
        
count_amenities.short_description = "HAHAHAHAHHAHAHAHAH"


단, 저 부분은 클릭이 되지 않는다. 장고가 저 부분이 함수라는 것을 인지하지 때문.

count_amenities의 인자 중 obj가 뭔지 살펴보자.

    def count_amenities(self, obj):
        print(obj)
        return "Potato"

Room 패널을 클릭하면 콘솔에 아래의 메시지가 출력된다.

LALALA HOUSE는 Room 클래스의 이름이고 이 이름을 반환하는 Room 클래스를 의미한다.

    def count_amenities(self, obj):
        print(obj.amenities.all())
        return "Potato"

Room 클래스를 통해 amenities를 살펴보면 아래와 같이 QuerySet이 뜬다.

profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글