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() ) И в моем шаблоне: {% csrf_token %} {% for field in myform %} {{ field.errors }} {{ field.label_tag }} {{ field }} {% endfor %}

Вопрос:

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

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 явно перезаписывается последним выбором? Как получить доступ к представленным данным в виде отдельных переменных?

Любая помощь была оценена.

Лучший ответ:Содержание

  1. Использование форм Django
  2. Примечания по использованию GET vs POST с формами
  3. Используя request.GET
  4. Документация

Использование форм 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 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

Ответ №1

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

Ответ №2

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

Оцените статью
Добавить комментарий