Pergunta

No PHP, eu faria isso para obter name como uma matriz.

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

Ou se eu queria ficar name como uma matriz associativa:

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

O que é o equivalente Django para essas coisas?

Foi útil?

Solução

Confira a documentação QueryDict , particularmente o uso do QueryDict.getlist(key) .

Desde request.POST e request.GET na vista são instâncias de QueryDict, você poderia fazer isso:

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

Em seguida, algo como isto:

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

Outras dicas

Infelizmente para cavar isso, mas Django tem um utils.datastructures.DotExpandedDict. Aqui está um pedaço dele de docs:

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

A única diferença é que você usa dot é em vez de colchetes.

EDIT: Este mecanismo foi substituído por prefixos de formulário, mas aqui está o código antigo que você pode cair em seu aplicativo se você ainda quiser usar este conceito: https://gist.github.com/grzes/73142ed99dc8ad6ac4fc9fb9f4e87d60

Django não fornece uma maneira de obter arrays associativos (dicionários em Python) do objeto de solicitação. Como a primeira resposta apontou, você pode usar .getlist() conforme necessário, ou escrever uma função que pode levar um QueryDict e reorganizá-lo ao seu gosto (tirando pares de chave / valor se a chave corresponde algum padrão key[*], por exemplo).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top