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 = (
"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이 뜬다.