Old Branch

Django - tweetme 소셜서비스 구현해보기 (10) - Class based View

woolbro 2019. 10. 24. 01:51
반응형

안녕하세요 이번 포스팅에서는 View를 수정 해 보려고 합니다.

이전의 포스팅 중 하나의 글에서 View의 종류에 대해서 다루어 보았습니다.

[Dev/Django] - Django - tweetme 소셜서비스 구현해보기 (7) - CRUD & First View 작성

 

Django - tweetme 소셜서비스 구현해보기 (7) - CRUD & First View 작성

안녕하세요, 이번 포스팅은 tweetme 소셜 서비스의 CRUD와 View를 작성 해 보도록 하겠습니다. 이번 포스팅의 코드는 Github 저장소에 업로드 되어있습니다 :) <--링크 우선, CRUD와 View의 개념에 대한 간단한 설..

woolbro.tistory.com

 

오늘은 그 View의 종류 중 Class를 base로 하는 View를 작성 해 보도록 하겠습니다.

 

포스팅의 모든 코드는 Github 저장소에 업로드 되어있습니다 :)

 


 

1. Class-based View

이전에 작성했던 tweets 앱의 views.py를 아래와 같이 수정 해주도록 하겠습니다.

from django.shortcuts import render
from django.views.generic import DetailView, ListView

from .models import Tweet
# Create your views here.


class TweetDetailView(DetailView):
    template_name = "tweets/detail_view.html"
    queryset = Tweet.objects.all()

    def get_object(self):
        return Tweet.objects.get(id=1)

class TweetListView(ListView):
    template_name = "tweets/list_view.html"
    queryset = Tweet.objects.all()



def tweet_detail_view(request, id=1):
    obj = Tweet.objects.get(id=id) #GET from database
    print(obj)
    context ={
        "object" :obj
    }
    return render(request, "tweets/detail_view.html",context)

def tweet_list_view(request):
    queryset = Tweet.objects.all()
    print(queryset)
    for obj in queryset:
        print(obj.content)
    context = {
        "object_list" : queryset
    }
    return render(request, "tweets/list_view.html",context)

클래스가 추가되었습니다.

 

대표로, DetailView 클래스와 tweet_detail_view를 비교 해 보도록 하겠습니다.

같은 기능을 하고, 같은 역할을 하지만 클래스와 함수의 차이를 가지고 있습니다.

class TweetDetailView(DetailView):
    template_name = "tweets/detail_view.html"
    queryset = Tweet.objects.all()

    def get_object(self):
        return Tweet.objects.get(id=1)


def tweet_detail_view(request, id=1):
    obj = Tweet.objects.get(id=id) #GET from database
    print(obj)
    context ={
        "object" :obj
    }
    return render(request, "tweets/detail_view.html",context)

함수형 뷰의 tweet_detail_view에서 사용한 render 기능이, TweetDetailView 클래스에서는 template_name 으로 변수로 두어 같은 역할을 하게 만들어 주었습니다.

 

장고 클래스 뷰에서는, template_name을 작성 해 주면 해당하는 페이지로 자동으로 랜더링이 됩니다.

 

위의 Views.py를 수정 해 주었으니까, views.py를 이어주고 있었던 같은 경로의 urls.py도 같이 수정 해 주도록 하겠습니다.

from django.conf.urls import url
from .views import tweet_detail_view, tweet_list_view, TweetListView, TweetDetailView

urlpatterns = [
    # url(r'^$', tweet_list_view, name='list'),
    # url(r'^1/$', tweet_detail_view, name='detail')
    url(r'^$', TweetListView.as_view(), name='list'),
    url(r'^1/$', TweetDetailView.as_view(), name='detail')
]

기존의 url은 주석처리 해 주었고, 아래의 url 매핑으로 작성한 클래스를 이어주었습니다.

여기서, 클래스를 불러오면서 as_view()를 뒤에 추가 해 주어 해당하는 클래스가 view의 역할을 한다고 명시 해 주었습니다.

 

서버를 실행시켜 확인 해 보도록 하겠습니다.

Class-Based View도 같은 역할을 해 주는 것을 확인 할 수 있습니다.

 

2. Class-Based View 기본 template 설정하기

우리가 작성한 Class-Base View에는 template_name으로 랜더링 해주는 템플릿 이름을 초기화 해 주었습니다.

테스트와 기능 설명을 위해서 기본 설정과는 다르게 우리가 임의로 설정 해 주었는데, 다시 기본설정으로 돌려주도록 하겠습니다.

 

from django.shortcuts import render
from django.views.generic import DetailView, ListView

from .models import Tweet
# Create your views here.


class TweetDetailView(DetailView):
    #template_name = "tweets/detail_view.html"
    queryset = Tweet.objects.all()

    def get_object(self):
        return Tweet.objects.get(id=1)

class TweetListView(ListView):
    #template_name = "tweets/list_view.html"
    queryset = Tweet.objects.all()



def tweet_detail_view(request, id=1):
    obj = Tweet.objects.get(id=id) #GET from database
    print(obj)
    context ={
        "object" :obj
    }
    return render(request, "tweets/detail_view.html",context)

def tweet_list_view(request):
    queryset = Tweet.objects.all()
    print(queryset)
    for obj in queryset:
        print(obj.content)
    context = {
        "object_list" : queryset
    }
    return render(request, "tweets/list_view.html",context)


template_name이라는 변수를 주석처리하면,

Template이 존재하지 않습니다~ 하면서 필요한 html파일을 얘기 해 주고 오류를 뱉어냅니다.

 

이제 각각 필요한 html 파일은 tweet_detail.html 과, tweet_list.html입니다.

 

기존의 html의 이름을 각각 tweet_detail.html 과, tweet_list.html으로 수정 해 주도록 하겠습니다.

detail_view.html --> tweet_detail.html
list_view.html --> tweet_list.html

수정 후 확인해보면, 잘 나오는 것을 볼 수 있습니다!!