Django 함수 기반 뷰를 클래스 기반 뷰로 쉽게 변환
이 게시물은 YouTube 자습서의 가이드로 사용되므로 전체video tutorial를 시청하고 source code을 참조하는 것이 좋습니다.
기능 기반 뷰
현재 가지고 있는 뷰를 간단히 살펴보는 것으로 시작하겠습니다.
뷰 파일에는 노트 생성, 읽기, 업데이트 및 삭제를 위한 기본 CRUD 작업을 따르는 뷰가 있습니다.
def TaskList(request):
if request.method == 'GET':
tasks = Task.objects.all().order_by('-updated')
context = {'tasks':tasks}
return render(request, 'base/index.html', context)
if request.method == 'POST':
task = Task.objects.create(
body=request.POST.get('body')
)
task.save()
return redirect('tasks')
## ------------------------------------------------------
def TaskDetail(request, pk):
if request.method == 'GET':
task = Task.objects.get(id=pk)
context = {'task':task}
return render(request, 'base/task.html', context)
if request.method == 'POST':
task = Task.objects.get(id=pk)
task.body = request.POST.get('body')
task.save()
return redirect('tasks')
## ------------------------------------------------------
def TaskDelete(request, pk):
task = Task.objects.get(id=pk)
if request.method == 'POST':
task.delete()
return redirect('tasks')
context = {'task':task}
return render(request, 'base/delete.html', context)
클래스 기반 뷰를 원시 상태로 유지
클래스 기반 뷰는 사용하기 어렵기 때문이 아니라 진행 상황과 이를 수정하기 위해 수행해야 하는 작업을 정확히 이해하기 어렵게 만드는 추상화 계층이 있기 때문에 복잡성 수준이 있습니다. Django는 빠른 개발을 위해 사용할 수 있는 여러 내장 뷰를 제공하지만 뷰의 내용을 알기도 전에 내부에 많은 마법이 있기 때문에 실제로 혼란을 줄 수 있습니다.
따라서 내장된 뷰를 사용하는 대신 원시 상태를 유지하고 Django가 제공하는 기본 뷰만 확장하고 처음부터 모든 논리를 작성하여 클래스 기반 뷰가 함수 기반 뷰와 어떻게 비교되고 다른지 확인할 수 있습니다.
클래스 기반 보기에 대한 몇 가지 사항
시작하기 전에 클래스 기반 보기에 대해 알고 싶은 몇 가지 사항이 있습니다.
기본 View 클래스 확장
모든 클래스 기반 보기는 기본
View
클래스를 확장합니다. 다른 기본 제공 보기를 사용하지 않으므로 가져오기View
를 확인하고 각 클래스에 "보기"를 전달합니다.from django.views import View
...
class OurView(View):
http 방식으로 분리
클래스 기반 보기를 사용하여 코드를 HTTP 동사로 분리합니다. 따라서
if request.method == 'POST'
와 같은 작업을 수행하는 대신 post
클래스에서 제공하는 View
메서드를 수정하고 해당 메서드가 post
요청에서 발생하는 모든 작업을 처리하도록 합니다. get
요청도 마찬가지입니다.전:
class OurView(View):
def get(self, request):
pass
def post(self, request):
pass
첫 번째 뷰부터 시작하겠습니다.
작업 목록 보기
TaskList
뷰를 주석 처리하고 처음부터 다시 빌드해 보겠습니다.이제 보기를 클래스로 다시 작성하고
View
클래스에서 상속합니다. 또한 이 새 클래스에 두 개의 메서드( get
및 post
)를 추가하고 각 메서드에서 self
앞에 request
를 전달하도록 합니다.클래스와 두 개의 메서드가 있으면 함수 기반 보기에서 논리를 추출하고 다음과 같이 각 http 메서드에 따라 새 클래스에 추가합니다.
from django.views import View
....
class TaskList(View):
def get(self, request):
tasks = Task.objects.all().order_by('-updated')
context = {'tasks':tasks}
return render(request, 'base/index.html', context)
def post(self, request):
task = Task.objects.create(
body=request.POST.get('body')
)
task.save()
return redirect('tasks')
이제 이 보기를 사용하려면 urls.py에서 클래스를 참조한 다음
as_view()
메서드를 사용해야 합니다.path('', views.TaskList.as_view(), name="tasks"),
마찬가지로 첫 번째 함수 기반 보기를 클래스 기반 보기로 변환했습니다!
작업상세 보기
이제
TaskDetail
에 대해 동일한 작업을 수행해 보겠습니다. 다시, 우리는 함수 기반 보기를 주석 처리하고 우리가 가진 모든 논리를 추출하여 http 메서드로 분리합니다.class TaskDetail(View):
def get(self, request, pk):
task = Task.objects.get(id=pk)
context = {'task':task}
return render(request, 'base/task.html', context)
def post(self, request, pk):
task = Task.objects.get(id=pk)
task.body = request.POST.get('body')
task.save()
return redirect('tasks')
그런 다음 이 뷰를 호출할 때의 URL 경로에
as_view()
를 추가합니다.path('<str:pk>/', views.TaskDetail.as_view(), name="task"),
태스크삭제 보기
이 시점에서 패턴이 보이기 시작했다고 확신하므로 삭제 보기에서 이전과 동일하게 수행해 보겠습니다.
class TaskDelete(View):
def get(self, request, pk):
task = Task.objects.get(id=pk)
context = {'task':task}
return render(request, 'base/delete.html', context)
def post(self, request, pk):
task = Task.objects.get(id=pk)
task.delete()
return redirect('tasks')
path('<str:pk>/delete/', views.TaskDelete.as_view(), name="delete"),
그래서 우리가 한 일을 요약해 봅시다.
각 보기에 대해 다음을 수행합니다.
def
에서 class
로 변경됨View
클래스http
메서드로 분리하고 요청 전에 추가함self
as_view()
의 각 보기에 urls.py
를 추가했습니다.Reference
이 문제에 관하여(Django 함수 기반 뷰를 클래스 기반 뷰로 쉽게 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dennisivy11/easily-convert-django-function-based-views-to-class-based-views-3okb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)