안녕하세요 이번 포스팅에서는 View를 수정 해 보려고 합니다.
이전의 포스팅 중 하나의 글에서 View의 종류에 대해서 다루어 보았습니다.
[Dev/Django] - Django - tweetme 소셜서비스 구현해보기 (7) - CRUD & First View 작성
오늘은 그 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
수정 후 확인해보면, 잘 나오는 것을 볼 수 있습니다!!
'Old Branch' 카테고리의 다른 글
Django - tweetme 소셜서비스 구현해보기 (11) - Dynamic URL Routing (0) | 2019.10.28 |
---|---|
[tip] Django 디버깅하기 - django-debug-toolbar (0) | 2019.10.25 |
Django - tweetme 소셜서비스 구현해보기 (9) - View function과 Templates에서의 응용 (0) | 2019.10.23 |
Django - tweetme 소셜서비스 구현해보기 (8) - Querying database & 콘솔, 웹에서 출력하기 (0) | 2019.10.22 |
[React-Native] React-Native 입문기 - ES6(2) 객체비구조화 (0) | 2019.10.21 |