2016-03-22 13 views
0

Wenn ich ein Formular über ein Ajax FormData Objekt an meine Django-Back-End senden, scheint meine request.POST ein Wörterbuch, dessen Werte Listen, keine Zeichenfolgen sind. Das heißt, ich erwarte, dass diese:Warum wird mein FormData-Objekt in ein Django-Listenwörterbuch eingefügt?

In [1]: request.POST 
Out[1]: {'somekey': 'somevalue', ...} 

Stattdessen ich diese bekommen:

In [2]: request.POST 
Out[2]: {'somekey': ['somevalue'], ...} 

Hier ist, wie ich einreichen:

var form = document.forms["my-form"] 
//note, all of #my-form's inputs are type="hidden" if it makes a difference... 
var fd = new FormData(form); 
var xhr = new XMLHttpRequest(); 
xhr.open('POST', '/my-view/', true); 
xhr.onload = function(){ 
    if(xhr.status == 200){ 
     //doStuff();... 
    } 
} 
xhr.setRequestHeader("X-CSRFToken", csrftoken); 
xhr.send(fd); 

Offensichtlich konnte ich Schleife durch meine request.POST Wörterbuch und drehen Sie diese Listen in Strings vor dem Versuch, ein Django Form Objekt mit den Daten zu instanziieren (für die Validierung), aber ich habe das Gefühl, dass etwas nicht stimmt. Warum wird mein FormData Objekt in ein Wörterbuch von Listen umgewandelt (was natürlich nicht so verwendet werden kann, um einen gültigen Django Form zu erstellen)?

Antwort

3

Ein QueryDict wie request.POST kann mehrere Elemente für jeden Schlüssel behandeln. Dies ist der Fall, ob es eine Ajax-Anfrage ist oder nicht.

Machen Sie sich keine Sorgen, Sie müssen die Daten nicht vorverarbeiten. Wenn Sie Ihr Formular mit request.POST instanziieren, wird das Formular ordnungsgemäß behandelt.

Wenn Sie Postdaten manuell verarbeiten, beachten Sie, dass es eine getlist-Methode gibt, mit der Sie die Liste abrufen können. Um das Beispiel aus der Dokumentation zu erstellen:

>>> from django.http import QueryDict 
>>> q = QueryDict('a=1&a=2&c=3') 
>>> q 
<QueryDict: {'a': ['1', '2'], 'c': ['3']}> 
>>> q['a'] # gets the last item 
u'2' 
>>> q.getlist('a') # gets the list 
[u'1', u'2'] 
>>> q['c'] # gets the last (and only) item 
u'3' 
>>> q.getlist('c') # gets the list (which contains a single item) 
[u'3'] 
+0

Bitte, Rollback meine Kommentare, wenn Sie nicht einverstanden sind. Grüße. – danihp

+1

@danihp Bearbeiten sieht gut aus, ich aktualisiert leicht – Alasdair

+0

Wow, du hast Recht. Das Formular wird mit einem QueryDict-Objekt instanziiert, aber nicht mit einem gewöhnlichen Wörterbuch mit Listen (nur ein Wörterbuch mit einzelnen Werten). Ich habe gerade etwas gelernt! Vielen Dank! – Escher

Verwandte Themen