Flask管理员自定义表单验证多个字段?

Dev*_*evy 5 python sqlalchemy flask flask-wtforms flask-admin

我一直打算创建一个基于多个字段值的自定义表单验证逻辑(在我的情况下,为确保确保日期范围数据的完整性,有2个字段,即IE start_time <end_time)。但是,翻阅Flask管理站点上的文档,我找不到任何地方可以做这种事情。我知道您可以轻松地将验证函数列表传递给类的子类中属性的validators参数,但是同样,按字段验证也不完全是我想要的。form_argsBaseModelView

所以我的问题是:如何一次验证多个字段?

另外,我看不到任何预保存的钩子事件函数可以执行此操作。我知道,on_model_change但是那是一个保存后的钩子,它会破坏将验证放在其中的验证目的。进行预保存动作的合适方式是什么?

Dev*_*evy 5

因此,在尝试并尝试了几种不同的方法之后,我进行多次表单域验证的方式仍然是固定的,on_model_change我知道它说更改完成后会调用事件挂钩-但是,由于它被包装在事务中,可以提出任何异常以回滚该事务。

这是我的示例代码以使其工作。

from flask.ext.admin.form import rules
from wtforms import validators

class TimeWindowView(LoggedInView):
    column_filters = ('scheduled_start', 'scheduled_end')
    form_create_rules = [
        rules.Field('scheduled_start'),
        rules.Field('scheduled_end'),
    ]

    def on_model_change(self, form, model, is_created):
        # if end date before start date or end date in the past, flag them invalid
        if (form.scheduled_end.data <= form.scheduled_start.data or
            form.scheduled_end.data <= datetime.datetime.utcnow()):
            raise validators.ValidationError('Invalid schedule start and end time!')
        else:
            super().on_model_change(form, model, is_created)
Run Code Online (Sandbox Code Playgroud)


Ang*_*los 5

您可以通过使用继承和自定义“validate_form”方法将自定义表单验证代码引入到您的烧瓶管理模型视图中,该方法在调用父“验证表单”之前合并您的验证代码。

如果您的验证逻辑发现问题,您的 validate_form 应显示适当的错误消息并返回 False,否则应继续运行原始的 Flask 管理验证表单代码。

from flask_admin.contrib.sqla import ModelView
from flask import flash

class MyModelView(ModelView):
    """ My model admin model view """

    def validate_form(self, form):
        """ Custom validation code that checks dates """
        if form.start_time.data > form.end_time.data:
            flash("start time cannot be greater than end time!")
            return False
        return super(MyModelView, self).validate_form(form)
Run Code Online (Sandbox Code Playgroud)

这是一个比 change_model_model 方法更自然的表单验证地方,它不应该关注模型逻辑,而不是表单验证逻辑。另外,请注意我们不需要使用异常并依赖于逆转事务。我们只是在任何事务发生之前捕获错误,闪现一条错误消息并优雅地返回“假”状态。

相关链接:

烧瓶管理文档

烧瓶管理源代码