Использование одинаковых имен переменных в разных весах в колбе - PullRequest
1 голос
/ 13 июня 2019

В моем приложении Flask я реализовал 2 новые формы, которые содержали одинаковые имена переменных. Обе формы были отправлены с одинаковым запросом POST. Результат сбивал с толку, поскольку данные о половой принадлежности отображались как дата рождения.

class Date_of_birth(Form):
    field_1 = DateField("Date of Birth", format="%Y-%m-%d")


class Gender(Form):
    field_1 = SelectField("Gender", choices=[("Male", "Male"), ("Female", "Female")])

Когда я изменил имена переменных на «field_1» и «field_2», чтобы они не были одинаковыми, это сработало.

Итак, я предполагаю, что несколько WTF, содержащих одинаковые имена переменных, не могут быть отправлены в одном запросе POST, но должны иметь разные имена переменных? Если так, то почему?

1 Ответ

0 голосов
/ 19 июля 2019

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

field_1=2000-01-01&field_1=Female

Данные содержат только имена полей и соответствующие им значения, поэтому сервер не может определитькакую пару имя / значение назначить какой форме, если существует несколько форм с конфликтующими именами полей.Таким образом, вам нужно использовать разные имена полей в html, чтобы сервер мог назначать правильные значения правильной форме в POST.

Однако wtforms предоставляет решение этой проблемы.Класс принимает префикс аргумент:

префикс - если указан, все поля будут иметь свои имена с префиксом и значением

Таким образом, вы можете создавать экземпляры своих форм следующим образом:

dob = Date_of_birth (префикс = 'dob') пол = Пол (префикс = 'пол')

Входной элемент HTML будет содержать префикс:

<input id="dob-field_1" name="dob-field_1" type="text" value="">

, и поэтому данные POST будут:

dob-field_1=2000-01-01&gender-field_1=Female

, а wtforms автоматически извлекут правильные значения на основе префикса :

>>> # Post data is usually in a MultiDict - a kind of dict that can have
>>> multiple values for a single key.

>>> data = MultiDict([('dob-field_1', '2000-01-01'), ('gender-field_1', 'Female')])
>>> dob = Date_of_birth(data, prefix='dob')  
>>> dob.validate()
True
>>> dob.data
{'field_1': datetime.date(2000, 1, 1)}


>>> gender = Gender(data, prefix='gender')
>>> gender.validate()
True
>>> gender.data
{'field_1': 'Female'}
...