수색…


소개

일반보기는 객체 생성, 편집 또는 삭제 또는 템플릿 표시와 같은 미리 정의 된 특정 작업을 수행하는보기입니다.

일반 뷰는 필요한 작업을 수행하기 위해 항상 수작업으로 작성되는 기능 뷰와 구별되어야합니다. 요컨대, 기능보기를 프로그래밍해야하는 동안 일반보기를 구성해야한다고 말할 수 있습니다.

일반 뷰를 사용하면 많은 표준화 작업을 수행 할 때 많은 시간을 절약 할 수 있습니다.

비고

이러한 예는 일반적인보기가 일반적으로 표준화 된 작업을 훨씬 단순하게 만든다는 것을 보여줍니다. 처음부터 모든 것을 프로그래밍하는 대신 다른 사람이 이미 프로그래밍 한 프로그램을 구성합니다. 이것은 많은 상황에서 의미가 있습니다. 배경에있는 프로세스보다는 프로젝트의 디자인에 더 집중할 수 있기 때문입니다.

그럼 항상 사용해야합니까? 아니요. 작업이 공정하게 표준화되고 (개체로드, 편집, 삭제) 작업이 반복적 일 경우에만 의미가 있습니다. 특정 일반보기를 한 번만 사용한 다음 모든 메서드를 재정 의하여 매우 구체적인 작업을 수행하는 것이 타당하지 않을 수 있습니다. 여기 기능적인 관점에서 더 나을 수도 있습니다.

그러나이 기능이 필요한보기가 많거나 작업이 특정 일반보기의 정의 된 작업과 일치하면 일반보기가 사용자의 일상 생활을 단순화하기 위해 필요한 것입니다.

최소 예 : 기능별보기와 일반보기

객체를 만들기위한 기능보기의 예. 주석과 공백을 제외하면 15 줄의 코드가 필요합니다.

# imports
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect

from .models import SampleObject
from .forms import SampleObjectForm

# view functioon
def create_object(request):
    
    # when request method is 'GET', show the template
    if request.method == GET:
        # perform actions, such as loading a model form
        form = SampleObjectForm()
        return render_to_response('template.html', locals())
    
    # if request method is 'POST', create the object and redirect
    if request.method == POST:
        form = SampleObjectForm(request.POST)

        # save object and redirect to success page if form is valid
        if form.is_valid:
            form.save()
            return HttpResponseRedirect('url_to_redirect_to')

        # load template with form and show errors
        else:
            return render_to_response('template.html', locals())

동일한 작업을 수행하기위한 '클래스 기반 일반 뷰'의 예. 우리는 동일한 작업을 수행하기 위해 7 줄의 코드 만 필요합니다.

from django.views.generic import CreateView

from .models import SampleObject
from .forms import SampleObjectForm

class CreateObject(CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

일반 뷰 사용자 정의

위의 예제는 작업이 완전히 표준 작업 인 경우에만 작동합니다. 예를 들어 여기에 추가 컨텍스트를 추가하지 마십시오.

좀 더 현실적인 예를 들어 봅시다. 템플릿에 페이지 제목을 추가한다고 가정합니다. 기능적인보기에서 이것은 다음과 같이 하나의 추가 라인만으로 작동합니다 :

def create_object(request):
    page_title = 'My Page Title'

    # ...

    return render_to_response('template.html', locals())

이것은 일반 뷰를 사용하여 달성하기가 더 어렵습니다 (또는 : 카운터 - 어투티브). 클래스 기반이므로 원하는 결과를 얻기 위해 하나 또는 여러 클래스 메서드를 재정의해야합니다. 이 예에서는 다음과 같이 클래스의 get_context_data 메소드를 재정의해야합니다.

class CreateObject(CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

    def get_context_data(self, **kwargs):
        
        # Call class's get_context_data method to retrieve context
        context = super().get_context_data(**kwargs) 
        
        context['page_title'] = 'My page title'
        return context

여기서는 추가하려는 첫 번째 추가 컨텍스트 변수에 대해 단 하나 대신 코드에 4 개의 추가 줄이 필요합니다.

믹스를 사용하는 일반 뷰

일반 뷰의 진정한 힘은 Mixins와 결합 할 때 펼쳐집니다. 믹스 인은 뷰 클래스가 상속 할 수있는 클래스가 정의한 클래스입니다.

모든 뷰에서 템플릿에 추가 변수 'page_title'을 표시한다고 가정합니다. 뷰를 정의 할 때마다 get_context_data 메소드를 대체하는 대신이 메소드로 mixin을 작성하고 뷰가이 mixin에서 상속되도록하십시오. 실제보다 더 복잡한 소리 :

# Your Mixin
class CustomMixin(object):
    
    def get_context_data(self, **kwargs):
        
        # Call class's get_context_data method to retrieve context
        context = super().get_context_data(**kwargs) 
        
        context['page_title'] = 'My page title'
        return context

# Your view function now inherits from the Mixin
class CreateObject(CustomMixin, CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

# As all other view functions which need these methods
class EditObject(CustomMixin, EditView):
    model = SampleObject
    # ...

이 기능의 장점은 코드가 기능적인 관점에서 볼 때보 다 훨씬 구조화되어 있다는 것입니다. 특정 작업이면의 전체 로직은 한 곳과 한 곳에서만 있습니다. 또한 다른 개체를 제외하고 항상 동일한 작업을 수행하는 많은보기가있는 경우 엄청난 시간을 절약 할 수 있습니다



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow