2009-04-29 15 views
44

In PHP, farei questo per ottenere name come array.Equivalente di Django dell'array value array/array associativo di PHP

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

O se volevo ottenere name come un array associativo:

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

Qual è l'equivalente Django per queste cose?

risposta

61

Check out the QueryDict documentation, in particolare l'utilizzo di QueryDict.getlist(key).

Dal request.POST e request.GET nella vista sono casi di QueryDict, si potrebbe fare questo:

<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> 

Poi qualcosa di simile:

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

Questo errore si verifica quando la chiave è importante. Per esempio name = "domanda [4]" dove 4 è domanda id. – Pawka

5

Django non fornisce un modo per ottenere array associativi (dizionari in Python) dall'oggetto richiesta. Come la prima risposta ha sottolineato, è possibile utilizzare .getlist() secondo necessità, o scrivere una funzione che può prendere uno QueryDict e riorganizzarlo a proprio piacimento (estraendo coppie chiave/valore se la chiave corrisponde ad alcuni pattern key[*], ad esempio).

18

Ci scusiamo per averlo scoperto, ma Django ha un utils.datastructures.DotExpandedDict. Ecco una parte dei documenti:

>>> 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']}}} 

L'unica differenza è che si utilizzano punti anziché parentesi. Penso che ora sia concettualmente sostituito con moduli prefissati in formset, ma la classe viene lasciata nella base di codice.

+0

Questa è la soluzione migliore che ho trovato. Grazie. – Pawka

+2

Mi affido a DotExpandedDict nelle mie app Django, ed è molto più utile di QueryDict.getlist. Sfortunatamente, è stato rimosso da Django (almeno la versione di sviluppo). Puoi ancora [prendere il codice sorgente per esso] (https://github.com/django/django/commit/c57abd3c29cedcca00821d2a0d5708f10977f3c6#django/utils/datastructures.py), però. – Matt

+2

DotExpandedDict rimosso da django 1.5 – lolesque

Problemi correlati