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

时间:2016-12-07 11:13:08

标签: django-templates django-csrf

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

包含模板可能如下所示:

{% include "template.html" %}

但是,如果该模板可能被不同的视图使用,那么您的上下文可能不仅仅是该模板上下文的超集。所以Django也允许你为模板指定上下文。

因为我希望避免在通过包含在另一个模板中呈现模板时意外引入不同的行为,并且当模板被呈现为视图的主要模板时,我也有意义使用{{1 }}选项,以避免它访问父模板的上下文。

所以我的包括这样:

only

然而,添加{% include "sub_template.html" foo=sub_context.foo bar=sub_context.bar only %} 会导致问题:only不再适用于该模板,因为我猜测Django所做的一些隐藏魔法已被排除。

Django记录的错误是

  

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

使用{% csrf_token %}呈现父模板 ,当子模板呈现为主模板且未包含时,错误不会发生。

此问题最明显的解决方法是不使用RequestContext only选项,这似乎是一种耻辱。有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:5)

我有同样的问题,并同意不使用它不是一个理想的解决方案。

结果{{csrf_token}}在父模板中运行正常,因此您可以使用它将裸csrf_token发送到包含的模板:

{%include“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