지네릭 뷰 -> 클래스기반 뷰(CBV), 장고 프레임워크에 구현되어 있는 기능 사용

종류

(1) Base View

 - View : 최상위에 있는 부모 지네릭 뷰 클래스

 - Template View : 주어진 템플릿으로 랜더링해주는 뷰

 - Redirect View : 주어진 URL로 리다이렉트해주는 뷰

(2) Generic Display View

 - ListView : 조건에 맞는 객체들의 목록을 보여주는 뷰

 - DetailView : 조건에 맞는 하나의 세부내용을 보여주는 뷰

(3) Generic Edit View

 - FormView : 폼을 출력해주는 뷰

 - CreateView : 객체를 Create 하는 뷰

 - UpdateView : 객체를 Update 하는 뷰 

 - DeleteView :객체를 Delete 하는 뷰

(4) Generic Date View

 - YearArchiveView : 해당 연도에 해당하는 객체를 출력하는 뷰

 - MonthArchiveView : 해당 에 해당하는 객체를 출력하는 뷰

 - DayArchiveView : 해당 에 해당하는 객체를 출력하는 뷰

 - TodayArchiveView : 오늘 날짜에 해당하는 객체를 출력하는 뷰

 - DateDetailView : 특정 연도, 월, 일에 해당하는 객체를 출력하는 뷰


1. urls.py

from django.urls import path

from . import views

app_name = ''
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
]

→ url패턴에 따라 views.py의 IndexView와 DetailView 함수 호출 (as_view()를 뒤에 붙여서 generic view 사용)

→ ex) poll/2 : url을 통해 넘어온 int 타입 2를 pk에 넣어서 호출하는 함수로 넘김 (generic view에서는 반드시 pk 사용)

2. views.py

(2) Generic Display View

from django.urls import reverse
from django.views import generic

class IndexView(generic.ListView):
    template_name = 'polls/index.html'			# default : app명/model명_list.html
    context_object_name = 'question_list'	# default : object_list
    paginate_by = 10					# 한페이지에 보여줄 object수

    def get_queryset(self):						# context 오버라이딩
        queryset = Question.objects.order_by('-regist_date')	# 등록일을 내림차순으로 설정
        return queryset
        
    def get_context_data(self, **kwargs):			# context 추가
        context = super().get_context_data(**kwargs)	# 기존 결과
        context['now'] = timezone.now()				# 기존 결과에 now 추가

        return context


class DetailView(generic.DetailView):
    model = Question					# queryset = Question.objects.all()
    template_name = 'polls/detail.html'			# default : app명/model명_detail.html

→ IndexView : generic.ListView 상속

→ DetailView : generic.DetailView 상속

● 속성&메서드

1. template_name : 연결시킬 템플릿명

2. context_object_name : 템플릿에서 사용할 모델의 변수명

3. paginate_by : 한페이지에 보여줄 object수(페이징, ListView에서 사용)

4. queryset : context 오버라이딩(수정)할 때 사용 (order, filter 등), get_queryset()과 같은 역할


1. get_queryset() : context 오버라이딩(수정)할 때 사용 (order, filter 등)

2. get_context_data(**kwargs) : context 추가

(3) Generic Edit View

from django.urls import reverse
from django.views import generic


class CreateView(SuccessMessageMixin, generic.CreateView):
    template_name = 'question_form.html'
    model = Question
    form_class = QuestionForm
    success_url = reverse_lazy('question:question_list')
    
    success_message = '질문이 등록되었습니다.'

● 속성

1. model : 연결시킬 모델명

 ( model = Quesion 은 queryset = Question.objects.all() 과 같음)

2. form_class : forms.py 에 구현되어 있는 폼의 class명

 - 지네릭뷰를 상속받았기 때문에 render() 필요없이 form_class 속성만 사용하면 django가 알아서 폼을 랜더링 해줌

3. success_url : post요청 성공했을 시 호출한 url

4. success_message (SuccessMessageMixin 상속) : post요청 성공했을 시 alert 시킬 메시지

<django official Documentation>

docs.djangoproject.com/en/3.1/ref/class-based-views/flattened-index/

<Class-Based-View Inspector>

ccbv.co.uk/