В моей форме у меня есть две кнопки, которые я использую для отправки формы. Одна кнопка удаляет выбранные файлы (представлены в виде таблицы, один флажок к объекту), а другая выбирает их для обработки.
Когда файлы выбираются при удалении, проверка не требуется (кроме проверки того, что был выбран хотя бы один файл). Однако для обработки мне нужно убедиться, что существует ровно один файл определенного расширения. По сути, мне нужны разные процессы проверки в зависимости от того, какую кнопку нажал пользователь.
Как мне лучше всего это сделать? Я знаю, что могу выполнить проверку в представлении, но я бы предпочел проверить это внутри формы, так как это чище.
Вот формы, о которых идет речь:
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