본문 바로가기
Programming

Django generic view 사용하기

by 하하호호 2021. 10. 6.
반응형

 

 

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 %}
    <h2>PERSON</h2>
    <ul>
        {% for person in object_list %}
            <li>{{ person.name }}</li>
        {% endfor %}
    </ul>
{% 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

 

반응형

댓글