Django Forms - получение данных из нескольких полей выбора - PullRequest
8 голосов
/ 23 февраля 2012

У меня есть такая форма:

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 ]

10 голосов
/ 23 февраля 2012

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

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

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 против 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

1 голос
/ 23 февраля 2012

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

0 голосов
/ 23 февраля 2012

Используйте form.is_valid() и form.cleaned_data['params'].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...