2016-03-26 10 views
0

Arbeiten mit Django, ich habe ein Modell Foo mit einem Fremdschlüssel zu einem Modell Bar. Wenn ich ein Foo Objekt auf meiner Site erstellen möchte, möchte ich Attribute des Bar Objekts in demselben Formular festlegen können.CSRF-Verifikationsfehler für einzelnes Formular mit zwei Modellen

Ich kann die Ansicht und die Vorlage festlegen, um diese beiden Modelle in derselben Form zu verwenden. Jedoch, wenn ich gehe, um das Formular zu senden, bekomme ich eine 403 verbotene Fehlermeldung sagen:

CSRF Token fehlt oder nicht korrekt.

Ich habe einen {% csrf_token %} Tag in meiner Form, also bin ich mir nicht sicher, wie ich das beheben soll. Hat jemand irgendwelche Ideen?

In meinem 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 %} 

EDIT: Ich bin nicht zu fragen, wie ein Formular mit zwei Modelle zu erstellen. Ich bin ziemlich sicher, dass das Formular korrekt erstellt wird und Informationen wie erwartet weitergegeben wird. Ich frage, warum ich den Fehler 403 erhalte, nachdem ich das Formular ausgefüllt und eingereicht habe.

Hier ist, was die erzeugte HTML wie folgt aussieht:

<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

Mögliche Duplikat [Django 2 Modelle 1 Form] (http://stackoverflow.com/questions/11512972/django-2-models-1-form) – yedpodtrzitko

+0

Leider @PedroLobito ausdrückte ich die falsch Frage. Es war ein Problem mit der API von ShareFile, nicht, wie man mit curl posten sollte. Ich habe mit meinem Aufruf zur API einen einfachen Fehler gemacht, aber herausgefunden. Ich hätte es dich wissen lassen sollen. – thanksd

Antwort

1

die render Verknüpfung statt render_to_response verwenden. Dadurch wird sichergestellt, dass die Vorlage mit gerendert wird, wodurch der Tag csrf_token funktioniert.

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 das funktioniert dank! – thanksd

Verwandte Themen