본문 바로가기
Web developer/Django

[Django] 함수 기반 뷰 vs. 클래스 기반 뷰 #DetailView

by doongjun 2020. 11. 14.

지난 포스팅에서는 방들의 리스트를 페이지로 나눠보면서 함수 기반 뷰(FBV)와 클래스 기반 뷰(CBV)를 비교했다.

2020/11/14 - [Python/Django] - [Django] 함수 기반 뷰 vs. 클래스 기반 뷰 #ListView

 

[Django] 함수 기반 뷰 vs. 클래스 기반 뷰 #ListView

지난 포스팅에 이어서 많은 방들의 리스트를 페이지로 나눌 것인데, 함수 기반 뷰(Funtion Based Views)와 클래스 기반 뷰(Class Based Views) 두가지 방법을 통해 웹 페이지를 제작해보려고 한다. 2020/11/13 -

doongjun.tistory.com

이번 포스팅에서는 방들을 클릭하면 나오는 세부사항을 FBV와 CBV를 사용해서 웹페이지를 제작하고 비교해보려한다.

우선 사용할 템플릿 파일은 아래와 같다.

{% extends "base.html" %} 

{% block page_name %}
    Home
{% endblock page_name %}

{% block content %}
<div>
    <h1>{{room.name}}</h1>
    <h3>{{room.description}}</h3>
</div>
<div>
    <h2>By: {{room.host.username}}
    {% if room.host.superhost %}
        (superhost)
    {% endif %}
    </h2>
    <h3>Amenities<h3>
    <ul>
    {% for a in room.amenities.all %}
        <li>{{a}}</li>
    {% endfor %}
    </ul>
    <h3>Facilities<h3>
    <ul>
    {% for a in room.facilities.all %}
        <li>{{a}}</li>
    {% endfor %}
    </ul>
    <h3>House Rule<h3>
    <ul>
    {% for a in room.house_rules.all %}
        <li>{{a}}</li>
    {% endfor %}
    </ul>
</div>
{% endblock %}

함수 기반 뷰(Funtion Based Views)

def room_detail(request, pk):
    try:
        room = models.Room.objects.get(pk=pk)
        return render(request, "rooms/detail.html", {"room": room})
    except models.Room.DoesNotExist:
        raise Http404()

방 링크를 클릭하면 pk를 받아와 Room모델에서 가져와 템플릿으로 넘겨주고 없는 방의 id를 받는다면 404에러를 띄운다.

http://127.0.0.1:8000/rooms/55

 

http://127.0.0.1:8000/rooms/12313

위와 같은 페이지을 클래스 기반 뷰(Class Based Views)를 사용해 구현한다면 어떻게 해야할까?

놀랍게도 두 줄만 있으면 된다! 

class RoomDetail(DetailView):

    """ RoomDetail Definition """

    model = models.Room

※ urls.py 확인

댓글