2014-02-10 4 views
6

Ich habe ein Formular mit nur einem Feld, das eine MultipleChoiceField ist. In der Vorlage wird es mit zwei anderen Formularen gedruckt, die ModelForm s im selben HTML-Formular sind (wie beschrieben here).Django forms.MultipleChoiceField wählt nur einen Wert

Wenn alle der POST Daten in der Ansicht zu lesen, alles ist da und korrekt funktioniert mit Ausnahme der Werte aus dieser MultipleChoiceField, die nur den zuletzt gewählten Wert aus dem Formular es, wenn die Auswahl direkt aus request.POST['field'] gezeigt wird - aber interessant genug Wenn ich request.POST drucke, ist alles ausgewählt. Wie ist das möglich? Das verwirrt mich wirklich.

Dies ist die Form:

class EstadosAtendidosForm(forms.Form): 
    estadosSelecionados = forms.MultipleChoiceField(choices = choices.UF.list) 

die Ansicht Dies ist:

@login_required 
@csrf_protect 
def cadastro_transportadora(request): 
    if request.method == 'POST': 
     print request.POST 
     print len(request.POST['estadosSelecionados']) 
     print request.POST 
     estadosSelecionados = request.POST['estadosSelecionados'] 
     for estado in estadosSelecionados: 
      print estado 

     form_end = EnderecoForm(request.POST) 
     form_transp = TransportadoraForm(request.POST) 



    else: 
     transportadora_form = TransportadoraForm() 
     endereco_form = EnderecoForm() 
     estados_form = EstadosAtendidosForm() 
     return render(request, 'transporte/transportadora/cadastro.html', {'transportadora_form': transportadora_form, 'endereco_form': endereco_form, 'estados_form': estados_form}) 

Und das ist die Vorlage:

{% extends "transporte/base.html" %} 

{% block main %} 
<h1>Cadastro de Transportadora</h1> 
<form enctype="multipart/form-data" action="" method="POST"> 
    {% csrf_token %} 
    <h4>Dados da transportadora</h4> 
    {{ transportadora_form.as_p }} 
    <h4>Endereço</h4> 
    {{ endereco_form.as_p }} 
    <h4>Estados atendidos</h4> 
    {{ estados_form.as_p }} 
    <input type="submit" /> 
</form> 
{% endblock %} 

Die Ausgabe des Drucks in der Ansicht, seit Zeile 5 bis 10, ist wie folgt:

<QueryDict: {u'nome': [u'Test name'], u'bairro': [u'Estrela'], u'logradouro': [u'R. SHudhsu'], u'numero': [u'234'], u'estadosSelecionados': [u'AM', u'RJ', u'SP'], u'telefone': [u'+559965321232'], u'cep': [u'88088888'], u'csrfmiddlewaretoken': [u'mQhxZlbosISw4acZOmTWw6FpaQPwg2lJ'], u'estado': [u'AM'], u'email': [u'[email protected]']}> 
2 
<QueryDict: {u'nome': [u'Test name'], u'bairro': [u'Estrela'], u'logradouro': [u'R. SHudhsu'], u'numero': [u'234'], u'estadosSelecionados': [u'AM', u'RJ', u'SP'], u'telefone': [u'+559965321232'], u'cep': [u'88088888'], u'csrfmiddlewaretoken': [u'mQhxZlbosISw4acZOmTWw6FpaQPwg2lJ'], u'estado': [u'AM'], u'email': [u'[email protected]']}> 
S 
P 

Sehen Sie, dass die Variable estadosSelecionados wirklich die 3 Werte enthält, die ich aus dem Formular richtig als Liste ausgewählt habe, wenn ich die gesamten request.POST Daten drucke, aber wenn ich nur request.POST['estadosSelecionados'] drucke, tut es das nicht.

Warum? Ich brauche wirklich Hilfe, um das zu verstehen. Vielen Dank.

Antwort

5

POST ist ein Objekt QueryDict, das ein besonderes Verhalten aufweist, wenn mehrere Werte im HTTP-POST für denselben Schlüssel übermittelt werden. Um alle zu erhalten, verwenden Sie die Methode getlist. Alternativ verwenden Sie einfach Ihr Formular - das Formularfeld sammelt die verschiedenen Werte für Sie.

0

Sie sollten nicht in request.POST suchen. Der Sinn der Verwendung eines Formulars besteht darin, dass es sich um die Typkonvertierung kümmert. Suchen Sie in form.cleaned_data['estadosSelecionados'] nach Überprüfung form.is_valid().

Verwandte Themen