POST上的django-uni-form helper和CSRF标签

时间:2011-01-22 22:55:34

标签: python django uniform

我正在使用django-uni-forms来显示我的字段,其中有一个相当简陋的例子。

当我使用<form>{%csrf_tag%} {%form|as_uni_form%}</form>呈现表单字段时,一切都按预期工作。

但是,django-uni-form Helpers允许您使用以下语法生成表单标记(以及其他与帮助程序相关的内容) - {% with form.helper as helper %}{% uni_form form helper%}{%endwith%} - 这会为我创建<form>标记,所以没有地方可以嵌入我自己的CSRF_token。当我尝试使用这种语法时,表单呈现完美,但没有CSRF令牌,因此每次提交表单都失败。

有没有人有这方面的经验?是否有既定的方法来添加令牌?出于重用原因,我更喜欢第二种语法。 谢谢!

4 个答案:

答案 0 :(得分:3)

您检查过来源了吗?它应该已经存在了。 uni_form模板标签应自动包含它。

答案 1 :(得分:2)

我遇到了与django-uni-form完全相同的问题。如果我使用的话,csrf令牌不会显示在<form>标记之后:

{% load uni_form_tags %}
{% uni_form form helper %}

或:

{% load uni_form_tags %}
{% with form.helper as helper %}
    {% uni_form form helper%}
{%endwith%}

如果我手动包含它,它可以工作:

<form action='{{ request.path }}' method='POST' class="uniForm">{% csrf_token %}
{{ form|safe }}
</form>

我找到了blog post,其中概述了如何手动包含csrf令牌:

helper = FormHelper()

csrf_token = Hidden(
                name = 'csrfmiddlewaretoken',
                value = request.META['CSRF_COOKIE'])
helper.add_input(csrf_token)

一点也不漂亮,但至少它会让单一形式发挥作用。

答案 2 :(得分:1)

最简单的解决方案是从GitHub安装django-uni-form,直到PyPi上的版本更新为0.8。

pip install https://github.com/pydanny/django-uni-form/tarball/master

答案 3 :(得分:1)

使用最新版本的django-uni-form。它修复了这个以及更多。