Project using python/Cloning Airbnb

django reservation-list on room in host by CBV with ListView

Cog Factory 2021. 3. 17. 09:26

url 설정

config/urls.py

urlpatterns = [
    path("rooms/", include("rooms.urls", namespace="room"))
]

reservations/urls.py

from django.urls import path
from . import views

app_name = "reservations"

urlpatterns = [
	path(
        "<int:user_pk>/reservation/<int:room_pk>/room-list/",
        views.ReservationListOnRoomView.as_view(),
        name="host-room-list",
    )]

CBV(Class Based View)

reservations/views.py

  CBV는 django에서 정의한 여러가지 View들을 이용한다. 그 중 ListView를 이용해서 reservation-list page를 작성한다. ListView는 model을 꼭 정의해줘야 한다. 하지만 model은 DB 안에 있는 모든 record를 가져온다. 내가 원하는 특정 목록만 가져오고 싶을 경우 model을 정의하지 않고 get_queryset() method를 이용해서 특정 list만 반환하면 된다.

# reservations/views.py

from django.views.generic import ListView
from django.shortcuts import redirect, reverse

from reservations import models as reservation_models
from users import mixins

class ReservationListOnRoomView(mixins.LoggedInOnlyView, ListView):

    """ Reservation List on Room View Definition """

    template_name = "pages/reservations/reservation_list_onRoom.html"
    context_object_name = "reservations"
    paginate_by = 12
    paginate_orphans = 6
    ordering = "created"

    def get_queryset(self):
        user_pk = self.kwargs.get("user_pk")
        room_pk = self.kwargs.get("room_pk")
        reservations = reservation_models.Reservation.objects.filter(
            room__host_id=user_pk, room_id=room_pk
        )

        if user_pk != self.request.user.pk:
            return redirect(reverse("core:home"))

        return reservations

    def get_context_data(self, **kwargs):
        user_pk = self.kwargs.get("user_pk")
        room_pk = self.kwargs.get("room_pk")
        reservations = reservation_models.Reservation.objects.filter(
            room__host_id=user_pk, room_id=room_pk
        )
        room_name = reservations[0].room.name
        context = super().get_context_data()
        context["room_name"] = room_name
        return context

templates

pages/reservations/reservation_list_onRoom.html

{% extends 'base.html' %}

{% block page_title %}
    {{request.user}}'s Reservation Room List
{% endblock page_title %}

{% block content %}

<div class="flex flex-col items-center justify-items-center">
    <div class="w-10/12">
        <div class="mb-8 mx-4">
            <h1 class="font-bold text-4xl ">{{room_name}}</h1>
        </div>
        <table class="w-full" border="1" bordercolor="blue" width="300px" height="150px" align = "center">
            <th>Room Name</th>
            <th>Guest</th>
            <th width="180px">Check In</th>
            <th width="180px">Check Out</th>
            <th width="180px">Status</th>
            <th width="180px">Confirm</th>
            <th width="180px">Cancel</th>
            {% for reservation in reservations %}
                <tr align="center">
                    <td class="text-base font-medium">{{reservation.room.name}}</td>
                    <td class="text-base font-medium">{{reservation.guest}}</td>
                    <td class="text-base font-medium">{{reservation.check_in}}</td>
                    <td class="text-base font-medium">{{reservation.check_out}}</td>
                    <td class="text-base font-medium">{{reservation.status|capfirst}}</td>
                    <td class="">
                        <button class="button w-3/4 mt-0 text-xs ">
                            <a href="#">Confirm</a>
                        </button>
                    </td>
                    <td>
                        <button class="button w-3/4 text-xs mt-0  bg-red-500">
                            <a  href="#">Cancel</a>
                        </button>
                    </td>
                </tr>
            {% endfor %}
        </table>
        <div class="flex justify-center mt-6 itmes-center">
            <button class="button bg-gray-700 w-1/6">
                <a href="{% url 'reservations:host-list' user.pk %}">Back</a>
            </button>
        </div>
        <div class="flex justify-center mt-20 itmes-center">
            {% include 'mixins/page_number.html' with page=reservations %}
        </div>
    </div>
</div>
{% endblock content %}

 

참고 자료

  • 노마드 코더의 Airbnb 클론 강의

소스 코드

github.com/zpskek/airbnb-clone-v3/commit/bf2d1ec013edfc664d3f96dec5f07c3ba2615953