view를 작성하는 방법을 크게 FBV(Function based view)와 CBV(Class based view)가 있다. 지금까지 함수 기반으로 view 파일을 작성한 것이다.
지금부터는 CBV를 살펴보자.
장고가 기본적으로 많이 사용하는 것들을 class로 구현해놓았고, 우리는 복잡한 코드 없이도 이것을 사용하여 view 파일을 손쉽게 만들 수 있었다.
하지만 CBV가 자동화가 되고 자유도가 떨어지는 만큼 우리는 프로젝트에 맞는 것을 사용하는 것이 좋다. CBV는 제네릭 뷰라고도 불린다.
# c앱에 views.py
from django.shortcuts import render
from django.views.generic import ListView
from b.models import Blog
# def indexC(request):
# return render(request, 'indexC.html')
class BlogList(ListView): #여기서 class명은 상관이 없습니다.
model = Blog
template_name = 'indexC.html'
# urls.py
from c.views import BlogList
urlpatterns = [
#.. 중략 ..
# path('cc/', indexC),
path('cc/', BlogList.as_view()),
#.. 중략 ..
여기서 blog_list는 models.py에 class 명에 따라 변경
# indexC.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>hello world C</h1>
{% for i in blog_list %}
<h1>{{ i.title }}</h1>
<p>{{ i.contents }}</p>
{% endfor %}
</body>
</html>
수정
# c앱에 views.py
from django.shortcuts import render
from django.views.generic import ListView
from b.models import Blog
# def indexC(request):
# return render(request, 'indexC.html')
class BlogList(ListView):
model = Blog
template_name = 'indexC.html'
ordering = '-pk'
아래 공식 Django 소스를 참고
공식 홈페이지에 API reference
Built-in class-based views API | Django documentation | Django
앞에서 작성했었던 simple 게시판에 상세 페이지도 구현해보기
# c앱에 views.py
from django.shortcuts import render
from django.views.generic import ListView, DetailView
from b.models import Blog
# def indexC(request):
# return render(request, 'indexC.html')
class BlogList(ListView):
model = Blog
template_name = 'indexC.html' #class명_list.html 파일을 자동으로 찾음
class BlogDetail(DatailView):
model = Blog
template_name = 'indexCdetail.html' #class명_detail.html 파일을 자동으로 찾음
# indexCdetail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>hello world C</h1>
<h1>{{ blog.title }}</h1>
<p>{{ blog.contents }}</p>
</body>
</html>
Built-in class-based views API
- Base views(뷰 클래스 생성)
- [View](최상위 뷰, 뷰에 기반)
- [TemplateView](템플릿 기반으로 렌더링 해주는 뷰)
- [RedirectView](리다이렉트 뷰 → 다른 곳으로 이동시키는 뷰)
- Generic display views(정보를 보여주는 뷰)
- [DetailView](특정 객체를 보여주는 뷰)
- [ListView](여러 객체를 보여주는 뷰)
- Generic editing views(CRUD 중 CUD를 제공해주는 view)
- [FormView](폼을 보여주는 뷰)
- [CreateView](객체를 생성할 수 있는 폼을 보여주는 뷰)
- [UpdateView](객체를 업데이트 할 수 있는 폼을 보여주는 뷰)
- [DeleteView](객체를 삭제할 수 있는 폼을 보여주는 뷰)
- Generic date views(날짜 기반의 뷰)
- [ArchiveIndexView](조건에 맞는 객체들의 날짜 정보 출력)
- [YearArchiveView](조건에 맞는 객체들의 연도 정보 출력)
- [MonthArchiveView](조건에 맞는 객체들의 월 정보 출력)
- [WeekArchiveView](조건에 맞는 객체들의 주 정보 출력)
- [DayArchiveView](조건에 맞는 객체들의 일 정보 출력)
- [TodayArchiveView](오늘 정보 출력)
- [DateDetailView](조건에 맞는 객체의 월 정보 출력, 단일정보)
'WEB > Django' 카테고리의 다른 글
[Django] url 개선 (0) | 2022.04.10 |
---|---|
[Django] ORM, Django Shell, QuerySet (0) | 2022.04.10 |
[Django] template language (0) | 2022.04.10 |
[Django] Django 구조와 MTV (0) | 2022.04.10 |
[Django] admin 페이지에 Notice 등록하기 (0) | 2022.04.10 |
댓글