Cog Factory 2021. 2. 26. 11:00

urlpattenrs

core/urls.py

  $ django-admin startapp core

  CBV랑 다 똑같고 path의 두 번째 인자만 다르다. FBV는 CBV와 다르게 .as_view()를 사용하지 않는다. 왜냐하면 homeView 자체가 function이기 때문이다.

core/urls.py

FBV(Function Based View)

rooms/views.py

  FBV에서는 Paginator를 호출해서 paginator object를 직접 만들어줘야 한다. 그리고 render()를 사용해서 pages/root/home.html을 랜더링한다.

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage
from . import models as room_models


def homeView(request):
    try:
        # Get list of rooms
        rooms_list = room_models.Room.objects.all()

        # Get paginator
        page = int(request.GET.get("page", 1))
        page_sector = (page - 1) // 5
        page_sector = page_sector * 5
        paginator = Paginator(rooms_list, 12, orphans=6)
        rooms = paginator.get_page(page)
    except EmptyPage:
        print("Empty page")

    return render(
        request,
        "pages/root/home.html",
        context={"rooms": rooms, "page_sector": page_sector},
    )

templates

pages/root/home.html

  html은 page=page_obj를 page=rooms로만 바꿔주면 된다. CBV에서는 page_obj를 자동으로 넘겨줬지만, FBV는 내가 직접 만들어서 줘야 하고, 내가 만든 page_obj는 rooms라는 이름으로 되어 있기 때문이다.

{% extends 'base.html' %}

{% block page_title %}Home{% endblock page_title %}

{% block content %}
  <div>
    <div>
      {% include 'mixins/room_card.html' with rooms=rooms %}
      <div>
        {% include 'mixins/page_number.html' with page=rooms %}
      </div>
    </div>
  </div>
{% endblock content %} 

참고 자료

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

소스 코드

github.com/zpskek/airbnb-clone-v3/commit/988426ef4c63bb78aff5b433bf10c26b4a8b7a2c