Django-render (), render_to_response () 및 direct_to_template ()의 차이점은 무엇입니까?


238

무슨 차이 사이에보기 (언어로 파이썬 / 장고 멍청한 놈은 이해할 수있다) render(), render_to_response()그리고 direct_to_template()?

예를 들어 Nathan Borror의 기본 앱 예제에서

def comment_edit(request, object_id, template_name='comments/edit.html'):
    comment = get_object_or_404(Comment, pk=object_id, user=request.user)
    # ...
    return render(request, template_name, {
        'form': form,
        'comment': comment,
    })

그러나 나는 또한 보았다

    return render_to_response(template_name, my_data_dictionary,
              context_instance=RequestContext(request))

    return direct_to_template(request, template_name, my_data_dictionary)

차이점은 무엇이며 특정 상황에서 무엇을 사용해야합니까?

답변:


185

https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#render

render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app])

render()render_to_response1.3에서 사용할 RequestContext수 있는 새로운 바로 가기를 사용하는 브랜드 로 지금부터 가장 확실하게 사용할 것입니다.


2020 편집 : render_to_response()Django 3.0에서 제거 되었음을 주목해야합니다.

https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#render-to-response

render_to_response(template[, dictionary][, context_instance][, mimetype])¶

render_to_response튜토리얼 등에 사용되는 표준 렌더 함수입니다. 사용 RequestContext하려면 다음을 지정해야합니다context_instance=RequestContext(request)


https://docs.djangoproject.com/en/1.8/ref/generic-views/#django-views-generic-simple-direct-to-template

direct_to_template는 새로운 render()기능과 마찬가지로 자동으로 RequestContext모든 기능을 사용 하기 때문에 내 URL 에서와는 달리 내보기에서 사용하는 일반적인보기입니다 context_processor.

그러나 함수 기반의 일반 뷰는 더 이상 사용되지 않으므로 direct_to_template 피해야 합니다. 사용 render또는 실제 수업은 https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/을 참조 하십시오.

RequestContext오래, 오랫동안 입력하지 않은 것이 행복 합니다.


1
보정. 문서에 따르면 render()1.3에서 사용할 수 있습니다.
AppleGrew의

@AppleGrew, 멋진 캐치! "커뮤니티"는 특정 지점을 가리 키도록 게시물을 수정했으며 1.4를 선택했습니다.
Yuji 'Tomita'Tomita

6
마 노트 : 기능을 기반으로 일반적인 전망 을 기반으로 작동하지, 사용되지 않습니다 전망 . Django와 함께 제공되는 일반 뷰는 이제 클래스 기반 뷰 (TemplateView)를 사용하여 구현되며 함수 (direct_to_template 등)로 구현되었습니다. 개인 취향에 따라 기능으로 구현 된 뷰는 계속 지원되며 변경되지 않습니다.
Nick Zalutskiy

40

Yuri, Fábio 및 Frosts를 Rephrasing하면 장고 멍청한 놈 (즉, 저)에 대한 답변-거의 확실하게 단순화되었지만 좋은 출발점입니까?

  • render_to_response()"원본"이지만 context_instance=RequestContext(request)거의 항상 PITA를 입력해야합니다.

  • direct_to_template()views.py에 정의 된보기없이 urls.py에서만 사용되도록 설계되었지만 RequestContext를 입력하지 않아도 views.py에서 사용할 수 있습니다

  • render()에 대한 바로 가기입니다 render_to_response()이 자동으로 공급 context_instance=Request장고 개발 버전 (1.2.1)에서 사용 가능한이 ....하지만 많은 사람들이 같은 자신의 바로 가기를 만든 이 하나 , 이 하나 또는 내 줬어요 처음 Nathans 그 하나 basic.tools. shortcuts.py


첫 번째 링크 ( import-awesome.com/… )는 404를 제공합니다
Lucio

네, 거의 4 살짜리 링크에서 일어날 수 있습니다!
Ryan

24

렌더

def render(request, *args, **kwargs):
    """ Simple wrapper for render_to_response. """
    kwargs['context_instance'] = RequestContext(request)
    return render_to_response(*args, **kwargs)

따라서 render_to_response템플릿 프리 프로세서가 작동하도록 컨텍스트를 감싸는 것 외에는 차이가 없습니다 .

템플릿으로 직접 보기일반적인보기 입니다.

render_to_response뷰 기능의 형태로 오버 헤드가 있기 때문에 여기에서 사용하는 것은 실제로 의미가 없습니다 .


12

장고 문서에서 :

render ()는 RequestContext를 강제로 사용하는 context_instance 인수를 사용하여 render_to_response ()를 호출하는 것과 같습니다.

direct_to_template다른 것입니다. views.py없이 html을 렌더링하기 위해 데이터 사전을 사용하는 일반적인 뷰입니다. urls.py에서 사용합니다. 여기 문서


6

위의 답변에서 찾을 수없는 메모 하나입니다. 이 코드에서 :

context_instance = RequestContext(request)
return render_to_response(template_name, user_context, context_instance)

세 번째 매개 변수는 context_instance실제로 무엇을 합니까? 존재 RequestContext는 그 다음에 추가됩니다 몇 가지 기본 컨텍스트를 설정합니다 user_context. 따라서 템플릿은이 확장 된 컨텍스트를 얻습니다. 추가되는 변수는 TEMPLATE_CONTEXT_PROCESSORSsettings.py에서 제공됩니다 . 예를 들어 django.contrib.auth.context_processors.auth는 템플릿에서 액세스 할 수있는 변수 user와 변수 perm를 추가합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.