如何在有限上下文随附的django模板中使用csrf_token

Spo*_*ser 2 django-templates django-csrf

Django模板允许您包括其他模板来构成页面。当您要渲染整个页面,但又想使用AJAX重新加载页面的一部分,又不想将所有渲染逻辑都移到javascript中(或更糟糕的是,在javascript中复制它)时,这特别有用。

包括模板如下所示:

{% include "template.html" %}
Run Code Online (Sandbox Code Playgroud)

但是,如果该模板可能被其他视图使用,则您的上下文很可能不仅仅是该模板的上下文的超集。因此,Django也允许您指定模板的上下文。

因为我想避免当模板被包含在另一个模板中而被渲染时以及模板被渲染为视图的主要模板时意外引入不同的行为,所以使用该only选项以避免访问该模板也很有意义。父模板的上下文。

所以我的包含看起来像这样:

{% include "sub_template.html" foo=sub_context.foo bar=sub_context.bar only %}
Run Code Online (Sandbox Code Playgroud)

但是,添加only会导致问题:{% csrf_token %}在该模板中不再起作用,因为我猜想Django所做的一些隐藏的魔术已被排除在外。

Django记录的错误是

UserWarning:在模板中使用了{%csrf_token%},但上下文未提供该值。这通常是由于未使用RequestContext引起的。

父模板渲染用RequestContext,并且当所述子模板呈现为所述主模板,不包括在内,不会发生错误。

解决此问题的最明显方法是不使用onlyto 的选项include,这似乎很可惜。有解决此问题的更好方法吗?

小智 6

我遇到了同样的问题,并且同意不只使用不是一个理想的解决方案。

事实证明{{csrf_token}}在父模板中工作正常,因此您可以使用它将裸露的csrf_token发送到所包含的模板中:

{%仅包含“ sub_template.html” foo = sub_context.foo csrf_token = csrf_token%}

然后{%csrf_token%}标签在另一端可以正常工作,并使用该值输出完整的隐藏输入元素。而且,您仍然可以获得仅在include中使用的优势。

我的答案是通过对该问题的答案进行实验而发现的: Django的{{csrf_token}}仅输出令牌值,而没有隐藏的输入标记