2016-03-26 24 views
0

使用Django,我有一个模型Foo与模型的外键Bar。当我在我的网站上创建Foo对象时,我希望能够以相同的形式设置Bar对象的属性。单个表单与两个模型的CSRF验证失败

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

CSRF令牌丢失或不正确。

我在我的表单中有一个{% 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> 
+0

[Django的2种型号1种形式](http://stackoverflow.com/questions/11512972/django-2-models-1-form) – yedpodtrzitko

+0

对不起@PedroLobito的可能的复制我措辞不正确的问题。这是ShareFile API的问题,而不是如何使用curl发布。我对API的调用发生了一个简单的错误,但是已经明白了。我应该让你知道。 – thanksd

回答

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}, 
    ) 
+0

Rad,谢谢! – thanksd