위의 두가지는 거의 모든 웹개발에서 이루어지는 프로세스이다.
따라서, 장고에서는 개발자가 이와 관련된 코드를 매번 처음부터 만들지 않아도 되도록,
geneirc views라는 기능을 제공한다.
views.py
의 설정from django.views import generic
로 import 하고, function 대신 Class를 만든다generic.ListView
와 generic.DetailView
두가지가 있다template_name
: 유저를 redirect할 template 페이지를 지정한다 (HttpResponseRedirect 가 포함됨)<app name>/<model name>_list.html
<app name>/<model name>_detail.html
context
:<model name>
이 context의 변수로 자동으로 할당된다<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'
urls.py
의 설정views.py
의 class를 참조함: views.IndexView.as_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'),
]