Django Books예제

김용녀·2022년 7월 14일
0
post-custom-banner

지난번엔 함수형 뷰를 이용해 작성했다면, 이번엔 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 블록 재정의하고있다.

profile
어서오세요
post-custom-banner

0개의 댓글