2009-04-29 7 views
44

In PHP würde ich dies tun, um name als Array zu bekommen.Django Äquivalent von PHP-Formular Wert Array/assoziative Array

<input type"text" name="name[]" /> 
<input type"text" name="name[]" /> 

Oder wenn ich wollte name als assoziatives Array erhalten:

<input type"text" name="name[first]" /> 
<input type"text" name="name[last]" /> 

Was ist das Django Äquivalent für solche Dinge?

Antwort

61

Check out the QueryDict documentation, insbesondere die Verwendung von QueryDict.getlist(key).

Seit request.POST und request.GET in der Ansicht sind Instanzen von QueryDict, könnten Sie dies tun:

<form action='/my/path/' method='POST'> 
<input type='text' name='hi' value='heya1'> 
<input type='text' name='hi' value='heya2'> 
<input type='submit' value='Go'> 
</form> 

Dann etwas wie folgt aus:

def mypath(request): 
    if request.method == 'POST': 
     greetings = request.POST.getlist('hi') # will be ['heya1','heya2'] 
+17

Dies schlägt fehl, wenn der Schlüssel wichtig ist. Zum Beispiel name = "question [4]", wobei 4 eine Frage-ID ist. – Pawka

5

Django bietet keine Möglichkeit, Assoziative Arrays (Wörterbücher in Python) aus dem Anfrageobjekt zu erhalten. Wie die erste Antwort darauf hingewiesen hat, können Sie .getlist() nach Bedarf verwenden, oder schreiben Sie eine Funktion, die eine QueryDict nehmen und nach Ihren Wünschen reorganisieren kann (Schlüssel/Wert-Paare herausziehen, wenn der Schlüssel zum Beispiel einem Muster key[*] entspricht).

18

Entschuldigung für das Ausgraben, aber Django hat ein utils.datastructures.DotExpandedDict. Hier ist ein Stück davon ist:

>>> d = DotExpandedDict({'person.1.firstname': ['Simon'], \ 
     'person.1.lastname': ['Willison'], \ 
     'person.2.firstname': ['Adrian'], \ 
     'person.2.lastname': ['Holovaty']}) 
>>> d 
{'person': {'1': {'lastname': ['Willison'], 'firstname': ['Simon']}, '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}} 

Der einzige Unterschied, dass Sie dot's anstelle von Klammern verwenden. Ich denke, es wird jetzt konzeptionell durch vorangestellte Formulare in Formsets ersetzt, aber die Klasse bleibt in der Codebasis.

+0

Dies ist die beste Lösung, die ich gefunden habe. Danke. – Pawka

+2

Ich verlasse mich auf DotExpandedDict in meinen Django-Apps, und es ist viel nützlicher als QueryDict.getlist. Leider wurde es aus Django entfernt (zumindest die Entwicklungsversion). Sie können jedoch [den Quellcode dafür holen] (https://github.com/django/django/commit/c57abd3c29cedcca00821d2a0d5708f10977f3c6#django/utils/datastructures.py), obwohl. – Matt

+2

DotExpandedDict wurde seit Django 1.5 entfernt – lolesque