Django Forms-получение данных из полей множественного выбора

у меня такая форма:

class MyForm(forms.Form):
    site = forms.ChoiceField(choices=SITE_CHOICES, label=ugettext_lazy('Site'),)  
    ...
    params = forms.MultipleChoiceField(
             choices=PARAM_CHOICES,
             label=ugettext_lazy('Select Parameters'),
             widget=forms.CheckboxSelectMultiple()
             )

и в моем шаблоне:

<form action="{% url results %}" method="get">{% csrf_token %}
{% for field in myform %}
<div class="field_wrapper">
    {{ field.errors }}
    {{ field.label_tag }} {{ field }}
</div>
{% endfor %}
<input type="submit" name="submit" value="{% trans 'Query' %}"  />
</form>

моя проблема в том, что когда я отправляю форму как GET, переменные выглядят следующим образом:

    site=1&params=foo&params=bar&params=something&submit=Query

мой params переменная явно перезаписывается последним выбором? Как получить доступ к представленным данным в виде отдельных переменных?

любая помощь ценится.

3 ответов


использование форм Django

вы должны используйте обработку формы Django с помощью POST что бы majke вещи проще. Вот:

if request.method == 'GET':
    form = MyFormClass()
else:
    form = MyFormClass(request.POST)
    if form.is_valid():
        do_something_with(form.cleaned_data['params'])
        return redirect('somewhere')
return render_to_response('my_template.html', RequestContext(request, {'form':form}))

примечания по использованию GET vs POST формы

бесполезно включать {% csrf_token %} если ты хочешь GET форма (абсолютно никакая проверка csrf не выполняется с GET запросы, которые имеют смысл, как GET запросы должны быть без изменения данных.

в любом случае, если вы действительно собираетесь GET страница, вы все еще можете использовать ту же логику, что и раньше, с небольшой настройкой:

form = MyFormClass(request.GET)
if form.is_valid():
    do_something_with(form.cleaned_data['params'])
    return render_to_response('some_template.html', {'stuff':some_stuff})
return render_to_response('form_submission_page.html', {'form':form})

последнее, используя GET для отправки данных обычно плохая практика, если вы не создаете какую-то функцию поиска или изменение отображения (разбиение на страницы и все).

используя request.GET

теперь, если по какой-то причине вы не хочу использовать формы Django, вы все еще можете обойти проблему и получить ваш params, вам просто нужно использовать QueryDict.getlist вместо QueryDict.get метод.

вот:

my_data = request.GET.getlist('params')

документация

не забудьте проверить документацию Django на QueryDicts и forms


и использовать {% csrf_token %} в get request-плохая практика.


использовать form.is_valid() и form.cleaned_data['params'].