2016-12-07 58 views
1

Django模板允許您包含其他模板來組成頁面。當你想渲染整個頁面,但是可能希望使用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 %}不再在模板中的作品,因爲我想一些隱藏的魔力,Django的確實已被排除。

該Django的記錄錯誤是

UserWarning:A {%csrf_token%}在模板中被使用,但上下文沒有提供該值。這通常是由於沒有使用RequestContext引起的。

父模板是具有RequestContext渲染,並且當所述子模板呈現爲所述主模板,不包括在內,不會發生錯誤。

對此問題最明顯的解決方法是不使用only選項include,這似乎是一個恥辱。有沒有更好的解決這個問題的方法?

回答

1

我有同樣的問題,並同意不使用只是不是一個理想的解決方案。

原來在父模板{{csrf_token}}工作得很好,所以你可以用它來傳達給包括模板發送赤裸裸csrf_token:

{%包括「sub_template.html爲」 foo = sub_context。 foo csrf_token = csrf_token only%}

然後,{%csrf_token%}標記在另一側正常工作,並使用該值輸出完全隱藏的輸入元素。而且您仍然可以享受僅在include中使用的優勢。 Django's {{ csrf_token }} is outputting the token value only, without the hidden input markup

我的回答是從與這個問題的答案實驗發現