2016-12-07 7 views
1

장고 템플릿을 사용하면 다른 템플릿을 포함하여 페이지를 작성할 수 있습니다. 이것은 전체 페이지를 렌더링하고 싶지만 AJAX를 사용하여 일부를 다시로드하고 모든 렌더링 논리를 javascript로 이동하지 않고 (또는 더 나쁜 경우 : javascript에서 복제하려는 경우) 특히 유용합니다. 다음과 같이 할 수있는 템플릿을 포함제한된 컨텍스트에 포함 된 django 템플릿에서 csrf_token을 사용하는 방법

:

{% include "template.html" %} 

해당 템플릿이 다른보기에서 사용할 수있는 경우에는, 당신의 컨텍스트는 해당 템플릿에 대한 컨텍스트 단지 상위 아니다 가능성이 높습니다. 따라서 Django에서는 템플릿의 컨텍스트를 지정할 수도 있습니다.

템플릿이 다른 템플릿에 포함되어 렌더링 될 때 실수로 다른 동작이 발생하지 않도록하고 템플릿을 뷰의 기본 템플릿으로 렌더링 할 때 only 옵션을 사용하는 것도 의미가 있습니다. 상위 템플릿의 컨텍스트에 액세스하지 못하도록합니다.

그래서 내 이런 모습을 포함한다 :

{% include "sub_template.html" foo=sub_context.foo bar=sub_context.bar only %} 

그러나, only 문제가 발생 것을 추가 : 나는 장고 제외 된 않는 숨겨진 마법의 일부를 추측하기 때문에 {% csrf_token %}가 더 이상 해당 템플리트에 작동합니다.

장고 로그 오류가

UserWarning입니다, • {%의 csrf_token %}이 템플릿에 사용했지만, 컨텍스트는 값을 제공하지 않았다. 이것은 대개 RequestContext를 사용하지 않기 때문에 발생합니다.

상위 템플릿 RequestContext로 렌더링하고, 상기 서브 템플릿을 포함 기본 템플릿으로 표현하고 있지 않은 경우, 에러가 발생하지 않는다.

이 문제의 가장 확실한 해결 방법은 only 옵션을 include으로 사용하지 않는 것입니다. 이는 수치 스럽습니다. 이 문제를 해결하기위한 더 좋은 방법이 있습니까?

답변

1

나는 동일한 문제가 있으며, 사용하지 않는 것이 이상적인 솔루션이 아니라는 데 동의합니다.

{%가 "sub_template.html"foo는 = sub_context이 포함

은 포함 된 템플릿을 통해 벌거 벗은 csrf_token를 보내려면이 사용할 수 있도록 {이 {csrf_token}}에 부모 템플릿에서 잘 작동 밝혀졌습니다. foo csrf_token = csrf_token only %}

그런 다음 {% csrf_token %} 태그는 다른 쪽에서 잘 작동하며 그 값을 사용하여 숨겨진 입력 요소를 모두 출력합니다. 그리고 당신은 여전히 ​​include에서만 사용하는 이점을 얻습니다. Django's {{ csrf_token }} is outputting the token value only, without the hidden input markup

:

은 내 대답은이 질문에 대한 답변 실험에서 발견 된