具有两个模型的单个表单的 CSRF 验证失败
CSRF verification failure for single form with two models
使用 Django,我有一个模型 Foo
,它有一个模型 Bar
的外键。当我在我的网站上创建一个 Foo
对象时,我希望能够以相同的形式设置 Bar
对象的属性。
我能够设置视图和模板以在同一表单中使用这两个模型。但是,当我去提交表单时,出现 403 Forbidden 错误:
CSRF token missing or incorrect.
我的表单中有一个 {% csrf_token %}
标签,所以我不确定如何解决这个问题。有人有什么想法吗?
在我的 views.py:
def foo_add(request):
if request.method == "POST":
fooForm = FooForm(request.POST, instance=Foo())
barForm = BarForm(request.POST, instance=Bar())
if fooForm.is_valid() and barForm.is_valid():
foo = fooForm.save()
bar = barForm.save()
return HttpResponseRedirect('/foos/add')
else:
fooForm = FooForm(instance=Foo())
barForm = BarForm(instance=Bar())
return render_to_response(
'foo_app/foo_add.html',
{'foo_form': fooForm, 'bar_form': barForm}
)
foo_add.html:
{% extends "foo_app/__base.html" %}
{% load bootstrap3 %}
{% block content %}
<form action="" method="post">{% csrf_token %}
{% bootstrap_form foo_form layout='inline' %}
{% bootstrap_form var_form layout='inline' %}
{% buttons %}
<button type="submit" class="btn btn-primary">
{% bootstrap_icon "star" %} Save Foo
</button>
{% endbuttons %}
</form>
{% endblock %}
编辑:我不是在问如何创建具有两个模型的表单。我漂亮 确信表单创建正确并且信息按预期传递。我在问为什么我在填写表格并提交后收到 403 错误。
这是生成的 HTML 的样子:
<form action="" method="post">
<div class="form-group">
<label class="sr-only" for="id_foo-a">A</label>
<input class="form-control" id="id_foo-a" name="foo-a"
placeholder="A" required="required" title="" type="text" />
</div>
<div class="form-group">
<label class="sr-only" for="id_bar-b">B</label>
<input class="form-control" id="id_bar-b" min="0" name="bar-b"
placeholder="B" required="required" title="" type="number" />
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">
<span class="glyphicon glyphicon-star"></span> Save Foo
</button>
</div>
</form>
使用 render
快捷方式代替 render_to_response
。这可确保使用 request
呈现模板,从而允许 csrf_token
标记起作用。
from django.shortcuts import render
def foo_add(request):
...
return render(
request,
'foo_app/foo_add.html',
{'foo_form': fooForm, 'bar_form': barForm},
)
使用 Django,我有一个模型 Foo
,它有一个模型 Bar
的外键。当我在我的网站上创建一个 Foo
对象时,我希望能够以相同的形式设置 Bar
对象的属性。
我能够设置视图和模板以在同一表单中使用这两个模型。但是,当我去提交表单时,出现 403 Forbidden 错误:
CSRF token missing or incorrect.
我的表单中有一个 {% csrf_token %}
标签,所以我不确定如何解决这个问题。有人有什么想法吗?
在我的 views.py:
def foo_add(request):
if request.method == "POST":
fooForm = FooForm(request.POST, instance=Foo())
barForm = BarForm(request.POST, instance=Bar())
if fooForm.is_valid() and barForm.is_valid():
foo = fooForm.save()
bar = barForm.save()
return HttpResponseRedirect('/foos/add')
else:
fooForm = FooForm(instance=Foo())
barForm = BarForm(instance=Bar())
return render_to_response(
'foo_app/foo_add.html',
{'foo_form': fooForm, 'bar_form': barForm}
)
foo_add.html:
{% extends "foo_app/__base.html" %}
{% load bootstrap3 %}
{% block content %}
<form action="" method="post">{% csrf_token %}
{% bootstrap_form foo_form layout='inline' %}
{% bootstrap_form var_form layout='inline' %}
{% buttons %}
<button type="submit" class="btn btn-primary">
{% bootstrap_icon "star" %} Save Foo
</button>
{% endbuttons %}
</form>
{% endblock %}
编辑:我不是在问如何创建具有两个模型的表单。我漂亮 确信表单创建正确并且信息按预期传递。我在问为什么我在填写表格并提交后收到 403 错误。
这是生成的 HTML 的样子:
<form action="" method="post">
<div class="form-group">
<label class="sr-only" for="id_foo-a">A</label>
<input class="form-control" id="id_foo-a" name="foo-a"
placeholder="A" required="required" title="" type="text" />
</div>
<div class="form-group">
<label class="sr-only" for="id_bar-b">B</label>
<input class="form-control" id="id_bar-b" min="0" name="bar-b"
placeholder="B" required="required" title="" type="number" />
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">
<span class="glyphicon glyphicon-star"></span> Save Foo
</button>
</div>
</form>
使用 render
快捷方式代替 render_to_response
。这可确保使用 request
呈现模板,从而允许 csrf_token
标记起作用。
from django.shortcuts import render
def foo_add(request):
...
return render(
request,
'foo_app/foo_add.html',
{'foo_form': fooForm, 'bar_form': barForm},
)