【问题标题】:CSRF verification failure for single form with two models具有两个模型的单个表单的 CSRF 验证失败
【发布时间】:2016-03-26 22:24:14
【问题描述】:

使用 Django,我有一个模型 Foo,其外键指向模型 Bar。当我在我的站点上创建Foo 对象时,我希望能够以相同的形式设置Bar 对象的属性。

我可以将视图和模板设置为以相同的形式使用这两个模型。但是,当我提交表单时,我收到 403 Forbidden 错误:

CSRF 令牌丢失或不正确。

我的表单中有一个{% csrf_token %} 标签,所以我不确定如何解决这个问题。有人有什么想法吗?

在我看来.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>

【问题讨论】:

  • Django 2 models 1 form的可能重复
  • 对不起@PedroLobito 我的问题措辞不正确。这是 ShareFile 的 API 的问题,而不是如何使用 curl 发布。我在调用 API 时犯了一个简单的错误,但我想通了。我应该让你知道的。

标签: python django csrf


【解决方案1】:

使用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},
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2013-06-15
    • 2016-06-18
    相关资源
    最近更新 更多