지난번엔 함수형 뷰를 이용해 작성했다면, 이번엔 generic과 클래스형 뷰를 이용해서 개발해보려한다.
설계는
첫화면 index.html에서 보고싶은 list를 정하고,
각 object에(***.list)에 들어가면 해당 object의 list를 볼수 있고,
detail.html에 들어가면 상세 정보를 볼수있다.
클래스 뷰는 urlpattern에서 as.view를 통해 호출될것이다.
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField('Author')
publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)
publication_date = models.DateField()
def __str__(self):
return self.title
class Author(models.Model):
salutation = models.CharField(max_length=100)
name = models.CharField(max_length=50)
email = models.EmailField()
def __str__(self):
return self.name
class Publisher(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=100)
website = models.URLField()
def __str__(self):
return self.name
크게 세개로 나눈 book,author,publisher을 모델링 해줬다.
book에서 author과의 관계를 ManyToMany를 통해 N:N관계로 정했고
publisher와는 외래키를 이용하여 Publisher와 N:1로 됐고, 연쇄 삭제 되는 CASCADE도 이용했다
from django.views.generic.base import TemplateView
from django.views.generic import ListView, DetailView
from books.models import Book, Author, Publisher
class BooksModelView(TemplateView):
template_name = 'books/index.html'
def get_context_data(self, **kwargs):
context = super(BooksModelView, self).get_context_data(**kwargs)
#context는 super()가 필수임!
context['object_list'] = ['Book', 'Author', 'Publisher']
return context
class BookList(ListView):
model = Book
class AuthorList(ListView):
model = Author
class PublisherList(ListView):
model = Publisher
class BookDetail(DetailView):
model = Book
template_name = 'books/book_detail.html'
class AuthorDetail(DetailView):
model = Author
template_name = 'books/author_detail.html'
class PublisherDetail(DetailView):
model = Publisher
template_name = 'books/publisher_detail.html'
BookModelView의 경우 index.html로 보여줄 목적으로 만든 클래스라
TemplateView를 상속받았다.
ListView는 제네릭뷰 중 하나로, 상속받으면 해당 객체가 들어있는 리스트를 구성해서 컨텍스트 변수로 넘겨준다.
DetailView는 특정 테이블로부터 레코드(객체)를 가져와 컨텍스트 변수를 구성한다.(이때 pk는 url 파라미터 이용) 그리고 각 html은 {%block tite%} , {%block sidebar%} , {%block content%} 3개의 블록을 이용해서 상속 구조를 갖는다.
base.html에서 home화면을 , base_books에서는 base.html을 상속받아 title블록과 sidebar 블록 재정의하고있다.