多个字段的Flask Admin自定义表单验证?

时间:2015-07-27 21:26:30

标签: python flask sqlalchemy flask-wtforms flask-admin

我一直打算创建一个基于多个字段值的自定义表单验证逻辑(在我的情况下,确保日期范围数据完整性的2个字段,I.E.start_time< end_time)。但是,翻阅烧瓶管理网站上的文档,我找不到任何地方可以做这种事情。我知道你可以非常简单地将一个验证函数列表传递给validators类的子类中form_args属性的BaseModelView参数,但同样,这是每个字段的验证不是正是我想要的。

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

另外,我没有看到任何预保存挂钩事件功能可以执行此操作。我知道on_model_change但是它是一个后保存钩子,它会破坏验证的目的,将验证放在那里。进行预保存操作的方式是什么?

2 个答案:

答案 0 :(得分:4)

因此,在尝试并尝试了几种不同的方法之后,我进行多个表单字段验证的方式仍然是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)

答案 1 :(得分:1)

您可以使用继承和自定义&#34; validate_form&#34;将自定义表单验证代码引入您的烧瓶管理模型视图。在调用父级之前合并验证代码的方法&#34;验证表单&#34;。

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

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)

进行表单验证比使用change_model_model方法更自然,它不应该关注模型逻辑,而不是表单验证逻辑。另外,请注意,我们不需要使用例外并依赖于撤销交易。我们只是在任何事务发生之前捕获错误,闪烁错误消息并优雅地返回&#34; False&#34;状态。

相关链接:

flask admin documentation

flask admin source code