08.-1 자잘한 수정

조재훈·2022년 7월 20일
0

Clone_Airbnb

목록 보기
15/31
post-thumbnail

1) users앱

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",)

2) reviews 앱

메소드를 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)

3) rooms

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

4) Reservations

일단 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",)

5) Lists 앱

리스트에 저장해놓은 방의 갯수를 세서 보여주는 기능
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",)


6) conversations 앱

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",)

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

0개의 댓글