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¶ms=foo¶ms=bar¶ms=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