Django 함수 기반 뷰를 클래스 기반 뷰로 쉽게 변환

17869 단어 djangopython
이 튜토리얼에서는 FBV(함수 기반 보기)로 빌드된 간단한 메모 앱을 CBV(클래스 기반 보기)로 변환합니다.

이 게시물은 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 클래스에서 상속합니다. 또한 이 새 클래스에 두 개의 메서드( getpost )를 추가하고 각 메서드에서 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를 추가했습니다.
  • 좋은 웹페이지 즐겨찾기