Вопрос:
У меня есть такая форма:
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 явно перезаписывается последним выбором? Как получить доступ к представленным данным в виде отдельных переменных?
Любая помощь была оценена.
Лучший ответ:Содержание
- Использование форм Django
- Примечания по использованию GET vs POST с формами
- Используя request.GET
- Документация
Использование форм 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’].