users 앱 admin에서 보여지는 메뉴 추가
users - admin.py - CustomUserAdmin
list_display = (
"username",
"first_name",
"last_name",
"email",
"is_active",
"language",
"currency",
"superhost",
"is_staff",
"is_superuser",
)
리스트 필터 기능도 추가
users - admin.py - CustomUserAdmin
list_filter = UserAdmin.list_filter + ("superhost",)
메소드를 admin.py에 등록할 경우 admin 패널에서밖에 못쓰게 된다. 만약 어떤 기능을 admin이 아닌 프론트엔드에서도 쓰고 싶다면 model.py에 적어야 한다.
사용자들이 항목별로 준 점수의 평균을 내는 함수를 정의한다.
reviews - models.py - Review
def rating_average(self):
avg = (
self.accuracy +
self.communication +
self.cleanliness +
self.location +
self.check_in +
self.value
) / 6
return avg
그리고 admin.py에서 불러온다.
reviews - admin.py - ReviewAdmin
list_display = ("__str__", "rating_average",)
숫자가 너무 지저분하니 소수점 2째 자리에서 끊자.
def rating_average(self):
avg = (
self.accuracy +
self.communication +
self.cleanliness +
self.location +
self.check_in +
self.value
) / 6
return round(avg, 2)
rooms - models.py - Room
def total_rating(self):
all_reviews = self.reviews.all()
for review in all_reviews():
print(review.rating_average())
return 0
여기서 self.reviews.all()에서 reviews는 rooms를 ForeignKey로 참조하는 Review클라스에서 room에 대한 related_name으로 지정한 'reviews'를 뜻하는 것이다.
즉, Room 클래스의 속성으로 생긴 review_set을 reviews로 대체한 것이므로 이를 이용해 room에서 self를 활용해 reviews를 불러오는 것이다.
rooms - admin.py - RoomAdmin
list_display = ("total_rating",)
콘솔에도 print 명령 결과가 나온다.
코드를 제대로 고치자.
def total_rating(self):
all_reviews = self.reviews.all()
all_ratings = 0
for review in all_reviews():
all_ratings += review.rating_average()
return all_ratings / len(all_reviews)
Admin 패널의 Review
Admin 패널의 Room
일단 Reservation 인스턴스 생성
reservations - admin.py - ReservationAdmin
list_display = (
"room",
"status",
"check_in",
"check_out",
"guest",
)
예약이 현재 날짜를 넘겼는지 아닌지를 표시해주는 기능을 추가하려 한다. 시간대를 인지하는 기능을 위해 임포트한다.
reservations - models.py
from django.utils import timezone
왜 파이썬에 있는 기능을 안쓰냐면, settings.py에 보면 장고가 이미 지역별 시간대를 관리하고 있다.
함수를 작성한다.
reservations - models.py - Reservation
def __str__(self):
return f"{self.room} - {self.check_in}"
def in_progress(self):
now = timezone.now().date()
return now > self.check_in and now < self.check_out
reservations - admin.py - ReservationsAdmin
list_display = ("in_progress",)
False로 뜨니 이쁘지가 않다.
reservations - models.py - Reservation
in_progress.boolean = True
시간대를 바꾸어보니 초록불도 뜬다.
함수를 하나 더 추가한다.
reservations - models.py - Reservation
def is_finished(self):
now = timezone.now().date()
return now > self.check_out
is_finished.boolean = True
reservations - admin.py - ReservationsAdmin
list_display = ("is_finished",)
날짜를 과거로 돌려보면
필터도 추가
reservations - admin.py - ReservationsAdmin
list_filter = ("status",)
리스트에 저장해놓은 방의 갯수를 세서 보여주는 기능
lists - models.py - List
def count_rooms(self):
return self.rooms.count()
lists - admin.py - ListAdmin
list_display = ("name", "user", "count_rooms",)
search_fields = ("^name")
filter_horizontal = ("rooms",)
conversations - admin.py - MessageAdmin
list_display = (
"__str__",
"created",
)
conversations - models.py- Conversation
def __str__(self):
usernames = []
for user in self.participants.all():
usernames.append(user.username)
return ", ".join(usernames)
Message 클래스에 related_name 등록
conversations - models.py - Message
user = models.ForeignKey("users.User", related_name="messages", on_delete=models.CASCADE)
conversation = models.ForeignKey("Conversation", related_name="messages", on_delete=models.CASCADE)
메세지 갯수를 세는 메소드 추가
conversations - models.py - Conversation
def count_messages(self):
return self.messages.count()
count_messages.short_description = "Number of messages"
def count_participants(self):
return self.participants.count()
count_participants.short_description = "Number of participants"
conversations - admin.py - ConversationAdmin
list_display = ("__str__", "count_messages", count_participants",)