Подтвердить форму 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 

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 
  • sqlalchemy.exc.InterfaceError: <непечатаемый объект InterfaceError>
  • Полный пример «много-к-одному» с использованием фляги, WTForm, SQLAlchemy и Jinja2
  • WTForms: IntegerField пропускает принуждение, когда строковое значение равно '0'
  • У меня возникают проблемы с wtforms selectfields, когда я использую POST с Flask
  • WTforms: Ошибка «поле отсутствует»
  • Как добавить атрибут, содержащий дефис в поле WTForms
  • как стекировать вертикально или горизонтально два поля WTform MultiCheckboxField
  • Использование полей HTML5 с WTForms
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.