2010-03-13 2 views
20

처음 두 단락은 일반적인 뷰가 내 인생을 더 쉽게, 더 적은 단조로운 확인하고 여성에게 좀 더 매력적으로 만들 예정되어 있다고 설명한다 (나는 것을 만들어 마지막) :일반 영어로 장고 일반보기는 무엇입니까? 이 페이지의

https://docs.djangoproject.com/en/1.4/topics/generic-views/

I 내 인생을 개선하기위한 모든 것이지만 일반적인 견해는 실제로 무엇을합니까? 다양한 유행어가 던져지고있는 것처럼 보입니다. 유행어가 설명하는 것보다 더 혼란 스럽습니다.

일반 뷰는 Ruby on Rails의 스 캐 폴딩과 유사합니까? 인트로의 마지막 글 머리 부분은 이것을 나타냅니다. 그게 정확한 진술인가요?

답변

19

장고 일반보기는 웹 응용 프로그램에서 매우 일반적인 기능을 수행하는보기 기능 (일반 오래된 파이썬 기능)입니다.

빌드하는 앱의 유형에 따라 매우 간단한보기를 많이 작성하지 않아도됩니다.

예를 들어, direct_to_template 일반보기는 템플릿을 RequestContext (즉, 현재 사용자와 같이 요청에 대한 정보에 대한 액세스 권한이 있음을 의미)로 렌더링합니다. 간단한 예를 들어

,이 같은 일을 쓰는 갈 수

# urls.py 
url('^some-url/$', some_view) 

# views.py 
def some_view(request): 
    return render_to_response('template_name.html', context_instance=RequestContext(request)) 

그냥이 :

# urls.py 
url('^some-url/$', direct_to_template, {'template': 'template_name.html'}) 

# views.py doesn't need any code for this view anymore 

예 : "표시와 같은 일반적인 작업을위한 더 복잡 일반적인 견해도있다 모델 목록 "또는"모델 추가 "를 참조하십시오.

일반 뷰는 단지 함수이기 때문에 일반적인 경우와 약간 다른 것이 필요할 때 자신의보기 함수 내에서 일반 뷰를 호출하여 "대부분의 작업"을 수행 할 수 있습니다.

+2

감사합니다, TM : 여기


는 폼 클래스들은 모두 주입니다. 그들은 이것을 문서에 추가해야합니다 :). 나는 일반 뷰에서 완전히 팔리지는 않았다. direct_to_template과 관련된 예제는 많은 코드 (2 줄)를 저장하지 않으며 수동으로 템플릿을 지정해야합니다. 나쁜 부분은 응용 프로그램을 조금 더 이해하기 어렵게 만든다는 것입니다. 왜냐하면이 간단한 작업을 수행하는 데 필요한 것보다 장고에 대해 더 많이 알고 있어야하기 때문입니다. – allyourcode

+1

@allyourcode 더 복잡한 코드를 저장하기 위해서는 더 복잡한 뷰를 사용하여 매우 빠른 예제를 선택했습니다. 또한 모델에서 작동하는보기의 경우 이름 지정 규칙을 기반으로 템플릿을 자동으로 선택합니다 (또는 규칙을 따르고 싶지 않으면 재정의 할 수 있음). 자세한 예제는 http://docs.djangoproject.com/en/1.1/ref/generic-views/를 참조하십시오. 이러한 뷰 중 일부를 처음부터 작성하고 비교하는 것이 좋습니다. 그 중 어느 것도 거대하고 복잡하지는 않습니다. 작성하고 디버그하는 것이 하나도 적습니다. –

+0

다시 한 번 감사드립니다. 나는 이미 Django 개발 버전의 문서를보고 있었다. – allyourcode

2

두 번째 질문에 대답하려면 : 아니오, 일반적인보기는 RoR의 스캐 폴딩과 관련이 없습니다. 스캐 폴딩은 이름에서 알 수 있듯이 코드 생성과 유사합니다. 일반 뷰는 다른 것입니다.

제 일반적인보기의 주된 용도는 매우 기본적인 render_to_response 기능의 상위 수준 대체입니다.

def my_view(request): 
    return render_to_response('my_template.html') 

그러나 이것은 매우 기본적인 : 이것은 당신이 render_to_response있는 간단한보기를 쓸 수있는 방법입니다! 예를 들어 명시 적으로 전달하지 않는 한 템플릿은 요청 컨텍스트에 액세스 할 수 없습니다.

나는 이렇게 대신 일반적인 뷰를 사용하는 것을 선호 :

def my_view(request): 
    return direct_to_template(request, template='my_template.html') 

지금 요청 컨텍스트에 전달됩니다! 그리고 그것은 시작에 불과합니다. 일반 뷰는 예를 들어 목록 또는 상세 뷰를 표시하려는 경우 유용합니다. 그들은 데이터베이스 질의 및 사용자 메시징을 관리합니다.

일반적인보기는보기에서 응답을 만드는 데 도움이되는 상위 수준 기능입니다.

+0

일반 뷰는 코드 생성을 포함 할 수 있지만 비슷한 역할을하는 것처럼 보입니다. 이전 버전의 레일즈에서는 컨트롤러에서 스캐 폴딩을 선언 할 수있었습니다 (장고 전문 용어로보기). 이렇게하면 사용자가 해당 모델에서 기본 CRUD 작업을 수행 할 수 있도록 여러 가지 방법을 컨트롤러에 동적으로 제공합니다. – allyourcode

+0

"일반 뷰는 코드 생성을 포함하지 않을 수도 있지만 ** 유사한 역할을 할 수도 있습니다"라고 가정합니다. 차라리 일반적인 견해 ... 내가 말한 것처럼 견해로부터 응답을 만드는 데 도움을 줄 것이라고 말하고 싶습니다. 가능한 한 응용 프로그램은 CRUD 작업입니다. 그러나 나머지 코드를 작성해야하므로 반드시 스캐 폴딩이 아닙니다. 또한 응답 생성에 반복성이 있다면 사용자 고유의 일반 뷰를 작성하는 것이 좋습니다. –

+0

+1 귀하의 기능에서 일반보기를 사용하는 방법을 언급합니다. Esp. 'update_object' 뷰를 호출하면 명확한 코드와 여전히 짧은 코드 인 두 가지 모두를 가장 잘 활용할 수 있습니다. – vdboor

4

일반보기를 사용하면 훨씬 짧은 코드를 작성할 수 있습니다.

비교 :

from django.http import HttpResponse, HttpResponseRedirect, Http404 
from django.shortcuts import render_to_response, get_object_or_404, redirect 
from myapp.models import Context 

def edit(request, item_id): 
    object = get_object_or_404(Context, pk=item_id) 

    if request.method == 'POST': 
     form = ContextForm(request.POST, instance=object) 
     if form.is_valid(): 
      form.save() 
      return redirect('myapp-context-index') 
    else: 
     form = ContextForm(instance=object) 

    return render_to_response("myapp/context/edit.html", {'object': object, 'form': form}) 

과 : 일반 뷰처럼

from django.core import urlresolvers 
from django.views.generic.create_update import update_object 
from myapp.models import Context 

def edit(request, item_id):  
    return update_object(request, 
     object_id=item_id,    
     form_class=ContextForm,    
     template_name="myapp/context/edit.html", 
     post_save_redirect=urlresolvers.reverse("myapp-context-index") 
    ) 

, 그들은 단지 정상적인 기능입니다. 원한다면 URLconf에 뷰를 완벽하게 구성 할 수 있습니다.

는 보너스로, 당신은 또한 얻을 :

  • 로그인 인증 검사가 django.contrib.messages에서
  • 성공 상태 메시지 (login_required=True을 통과).
  • 오류를 검사하는 코드가 줄어 듭니다.
  • form_class 대신 model 매개 변수를 제공하면 기본값은 ModelForm입니다.

template_name의 기본값은 "appname/model_form.html"이지만, 너무 나을 정도입니다.

class ContextForm(forms.ModelForm): 
    """The form for a context""" 
    class Meta: 
     model = Context 
     exclude = ('collection',) 

    def save(self, commit=True): 
     """Overwritten save to force collection_id to a value""" 
     model = super(ContextForm, self).save(commit=False) 
     model.collection_id = 1 
     if commit: 
      model.save() 
     return model