(Django) Using Generic Views

Kepler·2020년 2월 3일
1

Django

목록 보기
3/12
  • 유저가 요청한 URL의 parameter에 따라 데이터 베이스에서 알맞은 데이터를 받는 것,
  • template을 불러오고 렌더하는 것

위의 두가지는 거의 모든 웹개발에서 이루어지는 프로세스이다.
따라서, 장고에서는 개발자가 이와 관련된 코드를 매번 처음부터 만들지 않아도 되도록,
geneirc views라는 기능을 제공한다.

How-Tos

1.views.py의 설정

  • from django.views import generic 로 import 하고, function 대신 Class를 만든다
  • Class의 parameter는 generic.ListViewgeneric.DetailView 두가지가 있다
    • ListView :객체의 리스트를 display
    • DetailView : 객체 하나의 detail 페이지를 display
  • template_name : 유저를 redirect할 template 페이지를 지정한다 (HttpResponseRedirect 가 포함됨)
    • ListView의 디폴트값은 <app name>/<model name>_list.html
    • DetailView의 디폴트값은 <app name>/<model name>_detail.html
    • 이외로 설정할 경우, 변경 필요
  • context :
    + DetailView에서는 model에 맞춰서 <model name>이 context의 변수로 자동으로 할당된다
    • ListView의 경우, <model name>_list 가 자동으로 할당되므로, 필요에 따라 override가 필요하
  • get_queryset : 데이터베이스에 query할 객체를 정하는 함수
@ polls/views.py

from django.views import generic   # generic class를 사용할 수 있도록 import

from .models import Choice, Question

def IndexView(generic.ListView):    #ListView, parameter is fixed
    template_name = 'polls/index.html'   # default = "polls/question_detail.html"
    context_object_name = 'latest_question_list' # default = question_list

    def get_queryset(self): # func name is convetion
        return Question.objects.order_by('-pub_date')[:5] 
        #return the last five published questions

def DetailView(generic.DetailView): #DetailView, parameter is fixed
    model = Question   #어떤 모델에 DetailView를 사용할지를 정의 (models.py참조)
    template_name = 'polls/detail.html'

def ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'

2. urls.py의 설정

  • path의 두번째 parameter가 1.에서 설정한 views.py의 class를 참조함: views.IndexView.as_view()
  • generic view의 DetailView 를 사용하기 위해, URL이 pk여야 한다.
@ polls/urls.py

from django.urls import path
from . import views

app_name = 'polls'

urlpatterns = [
    # ex: /polls/
    path('', views.IndexView.as_view(), name='index'),
    # ex: /polls/5/
    path('<int:pk>/', views.DetailView.as_view(), name='detail'), #question_id => pk s로 변경
    # ex: /polls/5/results/
    path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
    # ex: /polls/5/vote/
    path('<int:question_id>/vote/', views.vote, name='vote'),
]
profile
🔰

0개의 댓글