Подтвердить форму WTForm на основе нажатой кнопки

В моей форме у меня есть две кнопки, которые я использую для отправки формы. Одна кнопка удаляет выбранные файлы (представлены в таблице, один флажок для объекта), а другой выбирает их для обработки.

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

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

Вот формы, о которых идет речь:

class ButtonWidget(object): """A widget to conveniently display buttons. """ def __call__(self, field, **kwargs): if field.name is not None: kwargs.setdefault('name', field.name) if field.value is not None: kwargs.setdefault('value', field.value) kwargs.setdefault('type', "submit") return HTMLString('<button %s>%s</button>' % ( html_params(**kwargs), escape(field._value()) )) class ButtonField(Field): """A field to conveniently use buttons in flask forms. """ widget = ButtonWidget() def __init__(self, text=None, name=None, value=None, **kwargs): super(ButtonField, self).__init__(**kwargs) self.text = text self.value = value if name is not None: self.name = name def _value(self): return str(self.text) class MultiCheckboxField(SelectMultipleField): """ A multiple-select, except displays a list of checkboxes. Iterating the field will produce subfields, allowing custom rendering of the enclosed checkbox fields. """ widget = ListWidget(prefix_label=False) option_widget = CheckboxInput() class ProcessForm(Form, HiddenSubmitted): """ Allows the user to select which objects should be processed/deleted/whatever. """ PROCESS = "0" DELETE = "-1" files = MultiCheckboxField("Select", coerce=int, validators=[ Required() ]) # This is the list of the files available for selection process_button = ButtonField("Process", name="action", value=PROCESS) delete_button = ButtonField("Delete", name="action", value=DELETE) def validate_files(form, field): # How do I check which button was clicked here? pass 

  • wtforms Подкласс класса класса и упорядочение полей
  • Как отправить результаты запроса в поле WTForm?
  • Установка значения по умолчанию для выбора удаляет введенные параметры для заполнения формы
  • Как заполнить поле выбора wtform с помощью mongokit / pymongo?
  • WTForms: две формы на одной странице?
  • Проверка валидации в WTForms не обновляется, когда база данных
  • Недействительный выбор для динамического поля выбора WTFORMS
  • Как использовать WTForms в проверке Ajax?
  • One Solution collect form web for “Подтвердить форму WTForm на основе нажатой кнопки”

    Главное, чтобы отметить кнопки в HTML, заключается в том, что только кнопка, которая была нажата, отправляет свои данные обратно на сервер. Таким образом, вы можете просто проверить, задано if form.process_button.data поле data кнопки, if form.process_button.data все будет работать в общем случае.

    В вашем конкретном случае, поскольку обе ваши кнопки вытаскивают свои данные из одного и того же имени базового параметра ( action ), вам нужно будет проверить, что данные в одном из полей ваших кнопок – это то, что вы ожидаете:

     def validate_files(form, field): # If the ButtonFields used different names then this would just be # if form.process_button.data: if form.process_button.data == ProcessForm.PROCESS: # Then the user clicked process_button else: # The user clicked delete_button 
    Python - лучший язык программирования в мире.