Django generic view 사용하기

Django generic view 사용하기

1. 제네릭 뷰 사용하기

Django 제네릭 뷰는 데이터베이스에 저장된

객체들의 정보를 렌더링하기에 편한 기능을

제공한다.

제네릭 뷰에는 두가지 함수가 있다.

DetailView : self.object로 프론토에 정보를 보내준다.

ListView : 객체 목록을 나타는 페이지다. self.object_list에 객체 목록을 정리해서 프론트로 보내준다.

먼저 데이터베이스 구조를 정의한다.

Django에서 models.py에 저장후

마이그레이션을 진행하면,

데이터베이스가 자동으로 생성된다.

# models.py from django.db import models class Person(models.Model): name=models.CharField(max_length = 255) logo=models.ImageField() description=models.TextField updated=models.DateField(auto_now=True) def __str__(self): return str(self.name)

urls.py에서 view의 함수를 호출하는 path를

설정해준다. name값으로 해당 함수가 호출되어

백엔드 기능이 작동된다.

HTML로 렌더링이 필요하면, render을

반환하면서 해당 HTML 파일로 데이터 및

렌더링 된다.

urls.py에 정의할 때는

함수이름.as_view()로 정의한다.

from django.urls import path urlpatterns = [ path = ('', views.person.as_view(), name='personview') ]

이제 views.py를 정의한다.

from django.veiws.generic import ListView from .models import Person class Person(ListView): person = Person

모델링된 데이터베이스 정보를

HTML에 표시는 다음과 같이 진행한다.

제네릭 뷰에서는 모델링된 객체의 값들을

"object_list"로 지정된 템플릿에

보내준다.

일반적으로 for문을 구현해서

리스트의 값들을 출력하는게

편리하다.

{% extends "base.html" %} {% block content %} PERSON {% for person in object_list %} {{ person.name }} {% endfor %} {% endblock %}

2. context 수정하기

django에서 context를 통해

HTML로 데이터를 보내주게 되는데,

object_list 말고 다른 네임을 사용하고자

한다면, context_object_name을 사용하면 된다.

from django.views.generic import ListView from .models import Person class PersonView(ListView): model = Person context_object_name = 'my_favorite_person_names'

3. context 확장하기

모델에 정의된 정보들 뿐만 아니라

다른 정보까지 보내고자 한다면,

context를 확장하는 함수를 정의하면 된다.

# views.py from django.views.generic import DetailView from books.models import Person, Book class PersonDetail(DetailView): model = Person def get_context_data(self, **kwargs): # 상속한 부모 클래스의 conductor를 실행한다. context = super(PersonDetail, self).get_context_data(**kwargs) # 새로운 정보를 context에 추가한다. context['book_list'] = Book.objects.all() return context

from http://incomeplus.tistory.com/174 by ccl(A) rewrite - 2021-10-06 17:26:57