URLconf
•
URL은 view와 template을 이어주는 역할을 하고, 이 부분을 만들어 주는 작업
View
•
뷰는 웹 요청을 받고, 전달받은 데이터들을 해당 어플리케이션의 로직으로 가공하여, 그 결과를 템플릿에 보내준다.
•
데이터를 가공하는 처리를 해야한다 싶으면 뷰에서 함수를 작성하면 된다.
•
view를 작성하는 두 가지 방법
1.
함수형 뷰 (FBV; Function based view)
2.
클래스형 뷰 (CBV; Class based view)
•
상속/재사용이 많이 필요한 프로젝트의 경우에는 CBV, 그렇지 않은 경우에는 FBV를 사용
장점 | 단점 | |
FBV | 편하게 구현 가능
읽기 편한 로직
데코레이터 사용 명료 | 확장 / 재사용 어려움 |
CBV | 확장 / 재사용 용이
다중 상속, Mixin 가능
HTTP Method가 클래스 안에서 나누어 처리
강력한 Generic Class View | 읽기 어려움
상속, Mixin으로 인해 코드 이해를 위해 여러 곳을 찾아봐야 함 |
FBV
뷰를 작성할 때 함수 형식으로 작성하는 방식
# urls.py
urlpatterns = [
path('', views.index, name='index')
]
Python
복사
# views.py
@api_view(['GET', 'POST'])
def index(request):
if request.method == 'POST':
return HttpResponse("Post method")
else:
return HttpResponse("Get method")
Python
복사
CBV
뷰를 작성할 때 클래스 형식으로 작성하는 방식
# urls.py
urlpatterns = [
path('', views.IndexView.as_view(), name='index')
]
Python
복사
# views.py
from django.views import View
class IndexView(View):
def post(self, request):
return HttpResponse("Post method")
def get(self, request):
return HttpResponse("Get method")
Python
복사
Generic CBV
•
모델: ivew가 작동하는 장고 모델을 정의.
•
fields: 장고에서 폼을 생성하는 데 사용됨 (또는 form_class를 제공할 수도 있습니다).
•
template_name: 사용할 템플릿을 정의
(기본값 : /<앱_이름>/<모델_이름>_form.html)
•
context_object_name: 모델 인스턴스가 템플릿에 전달되는 컨텍스트 키를 정의
(기본값은 object)
•
success_url: 성공 시 사용자가 리디렉션되는 위치를 정의
(또는 모델에서get_absolute_url을 설정할 수 있음).
from django.views.generic import ListView, DetailView, DeleteView, UpdateView, CreateView
class TaskListView(ListView):
model = Task
context_object_name = 'tasks'
class TaskCreateView(CreateView):
model = Task
context_object_name = 'task'
fields = ('name', 'description', 'is_done')
template_name = 'todo/task_create.html'
class TaskDetailView(DetailView):
model = Task
context_object_name = 'task'
class TaskUpdateView(UpdateView):
model = Task
context_object_name = 'task'
fields = ('name', 'description', 'is_done')
template_name = 'todo/task_update.html'
class TaskDeleteView(DeleteView):
model = Task
context_object_name = 'task'
success_url = '/'
Python
복사