Archive

[Django] Class-based View 본문

------ Web ------/Backend

[Django] Class-based View

enent 2022. 7. 4. 00:18
반응형

1. Class-Based View

효율적인 메소드 구분 및 상속 및 Generic View를 사용하기 위해 보통 Class로 View 함수를 구성한다

 

1) URL conf 

View Class에서 제공하는 as_view() 메소드를 통해 클래스형 뷰 사용을 명시해준다. 

 

#urls.py
from django.urls import path
from myapp.views import MyView

urlpatterns = [
	path('about/',MyView.as_view()),
    
]

 

2) View 정의

as_view() 메소드는  클래스의 인스턴스를 생성하고, disparch() 메소드를 호출하여 HTTP 메소드를 파악하여, 동일한 HTTP 메소드를 파악하여 해당 함수를 호출한다. 해당하는 HTTP 메소드가 정의되지 않았을 시엔 HTTPResponseNotAllowed Exception을 발생시킨다. ( as_view(),disparch() 메소드는 View 클래스에 정의되어 있음 )

# views.py
from django.http import HttpResponse
from django.views.generic import View

class MyView(View):
    def get(self, request):
    	#~~~
        return HttpResponse('result')

 

2. Generic View

웹 개발시 공통적으로 사용할 수 있는 로직을 개발해 놓은 View이다.

공통 로직을 추상화하여 제공하며, 이를 통해View 개발 과정에서 개발자의 단순 반복작업을 덜어주게 된다. 

클래스형 뷰로 구성되어 있으며 크게 4가지로 분류할 수 있다

  • Base View : View Class를 생성하여 다른 Generic View의 부모 클래스를 제공하는 기본 Generic View
    - View, TemplateView, RedirectView 등
  • Generic Display View : 객체 리스트 / 상세정보 보여줌
    - ListView, DetailView 등
  • Generic Edit View : Form을 통해 객체 생성/수정/삭제 기능 제공
    - FormView, CreateView, UpdateView, DeleteView 등
  • Generic Data View : 날짜 기반 객체의 연/월/일 페이지로 구분해서 보여줌
    - ArchiveIndexView, YearArchiveView, MonthArchiveView 등

 

클래스형 뷰 작성시, 주로 Generic View를 상속받아서 작성하게 된다.

이 때, 성격에 어떤 Generic View를 사용할 것인지 정해야한다

ex ) Table에서 복수의 Record를 가져오는 경우 - IndexView 사용,

       Table 에서 특정 한 개의 Record를 가져오는 경우 - ResultsView 사용

 

 

Ex1) Class based View를 활용한 Form 처리 

: GET / POST 등을 클래스 내의 메소드로 구분하여 처리

from django.http import HttpRespondRedirect
from django.shortcuts import render
from django.views.generic import View

from .forms import MyForm

class MyFormView(view):
    form_class = MyForm
    initial = {'key':'value'}
    template_name = 'form_template.html'
    
    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        return render(request, self.template_name, {'form':form})
        
    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            #form 처리 로직
            return HttpResponseRedirect('/success/')
        return render(request, self.template_name, {'form':form})

 

Ex2) Generic View ( FormView) 를 활용한 폼 처리

from .forms import MyForm
from django.views.generic.edit import FormView

class MyFormView(FormView):
    form_class = MyForm
    template_name = 'form_template.html'
    success_url = '/thanks/'
    
    def form_valid(self,form):
        #폼 처리 로직
        return super(MyFormView, self).form_valid(form)

*form_class : forms.py 내 클래스명 ( 사용자에게 보여줄 폼 정의)

*template_name : form 을 포함하여 렌더링할 템플릿 파일 이름

*success_url : MyFormView 처리가 정상적으로 완료되었을 떄 redirect 시킬 URL

*form_valid() 함수 : 유효한 폼 데이터로 처리할 로직. super() 를 통해 success_url로 지정된 URL로 redirect 처리

 

 
 
 
파이썬 웹 프로그래밍  - 4. Django 핵심기능
 
 
 
 
반응형

'------ Web ------ > Backend' 카테고리의 다른 글

[Django] Project Home Page (실습4)  (0) 2022.07.20
[Django] Book Application 개발 (실습3)  (0) 2022.07.13
[Django] Form  (0) 2022.07.03
[Django] Template System  (0) 2022.06.28
[Django] Admin  (0) 2022.06.26
Comments