django-uni-form助手与POST中的CSRF标签

3 投票
4 回答
767 浏览
提问于 2025-04-16 10:27

我正在使用django-uni-forms来显示我的表单字段,例子是直接来自他们的书,比较简单。

当我用 <form>{%csrf_tag%} {%form|as_uni_form%}</form> 来渲染表单字段时,一切都正常。

不过,django-uni-form的助手功能允许我用另一种语法来生成表单标签(还有其他相关内容),就是 {% with form.helper as helper %}{% uni_form form helper%}{%endwith%}。这样可以自动为我创建 <form> 标签,但我就没地方放自己的CSRF令牌了。当我尝试使用这种语法时,表单渲染得很好,但没有CSRF令牌,所以每次提交表单都会失败。

有没有人有过类似的经验?有没有什么固定的方法可以添加这个令牌?我更喜欢第二种语法,因为可以重复使用。谢谢!

4 个回答

1

最简单的办法是从GitHub上安装django-uni-form,直到PyPi上的版本更新到0.8。

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

我在使用django-uni-form的时候遇到了同样的问题。就是在<form>标签后面,csrf令牌没有显示出来,如果我使用:

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

我找到了一篇博客文章,里面讲了怎么手动加上csrf令牌:

helper = FormHelper()

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

虽然看起来不太美观,但至少这样可以让uni-form正常工作。

3

你有没有查看过源代码?它应该已经在那里了。uni_form 模板标签应该会自动包含它。

撰写回答