Как получить форму с повторяющимися элементами

Название действительно не говорит об этом, так как у меня проблемы с подведением итогов. Итак, вот длинное объяснение:

Предположим, я добавляю информацию о нескольких контактах, и у меня есть следующие поля:

  • Имя контакта
  • Метод контакта (адрес электронной почты, номер телефона, мгновенное сообщение)
    • Если электронная почта: Показать поле электронной почты (скажем, это поле существует)
    • Если номер телефона: показать поле номера телефона
    • Если мгновенное сообщение: показать текстовое поле

Так что сразу с места в карьер, мне понадобится JavaScript для завершения этого на самой странице (чтобы добавить поля для добавления или удаления контактов), с которыми я в порядке. Однако, поскольку я могу добавить несколько контактов (и как разработчик программного обеспечения, я не знаю, сколько контактов пользователь хочет добавить, это может быть 1, 10 или 100)

Поэтому моя самая большая проблема заключается в том, как я собираюсь структурировать такие вещи, как имена для каждого из полей. Должен ли я бросать все в такие вещи, как names[] , contactmethods[] и доступ к вещам по порядку, или если есть лучшее решение.

Кроме того, если сервер начинает проверять эту информацию и обнаруживает некорректную информацию, я хотел бы иметь возможность отправлять данные, которые клиент отправил на сервер обратно клиенту, чтобы они не потеряли все, что у них есть. вошел. Как я мог бы легко это сделать?

Некоторая справочная информация: используемые в настоящее время технологии (это актуально):

One Solution collect form web for “Как получить форму с повторяющимися элементами”

Нет необходимости что-либо строить (по крайней мере, на стороне сервера) – WTForms уже поддерживает то, что вам нужно – он называет их «полевыми приложениями» . Поведение, которое вы ищете, найдено в wtforms.fields.FormField и wtforms.fields.FieldList

 class ContactForm(Form): name = TextField("Name", validators=[Required()]) contact_type = SelectField("Contact Type", validators=[Required()], choices=[ ("email", "Email"), ("phone", "Phone Number"), ("im", "Instant Message") ]) # `If` is a custom validator - see below email_address = TextField("Email", validators=[If("contact_type", "email", [Required(), Email()]) ]) phone_number = TextField("Phone #", validators=[If("contact_type", "phone", [Required()]) ]) im_handle = TextField("IM Handle", validators=[If("contact_type", "im", [Required()]) ]) class SignUpForm(Form): # Other fields go here contacts = FieldList(FormField(ContactForm)) 

Вам также понадобится специальный валидатор для проверки соответствующего поля с учетом выбора пользователя:

 # CAUTION: Untested code ahead class If(object): def __init__(self, parent, run_validation=None, extra_validators=None, msg=None): self.parent = parent self.msg = msg if msg is not None else u"Invalid" if callable(run_validation): self.run_validation = run_validation else: _run_validation = lambda self, parent, form: parent.data == run_validation self.run_validation = _run_validation self.extra_validators = extra_validators if extra_validators is not None \ else [] def __call__(self, field, form): parent = getattr(form, self.parent) if self.run_validation(parent, form): return field.validate(form, extra_validators=self.extra_validators) 

Когда вы вызываете form.validate() на стороне сервера, поля будут автоматически проверяться на соответствие требованиям и ошибки будут заполнены соответствующим образом, чтобы вы могли вернуть их на клиентскую сторону.

Создание новых полей на стороне клиента является простым, и WTForms будет забирать их на задней панели, если вы field.short_name + '-' + index имя, используя то же самое соглашение об именах, которое оно использует, а именно field.short_name + '-' + index .

  • Получить выделенный текст из формы с помощью wtforms SelectField
  • Как перезагрузить WTForms
  • Разрыв отношений wtforms-алхимия?
  • Использование FieldList и FormField
  • Как предварительно установить флажки с помощью Flask / WTForms
  • Flask-SQLAlchemy: как условно вставить или обновить строку
  • Проверка валидации в WTForms не обновляется, когда база данных
  • Как использовать поле FieldList WFForms для FormFields?
  • Python - лучший язык программирования в мире.