我一直打算创建一个基于多个字段值的自定义表单验证逻辑(在我的情况下,确保日期范围数据完整性的2个字段,I.E.start_time< end_time)。但是,翻阅烧瓶管理网站上的文档,我找不到任何地方可以做这种事情。我知道你可以非常简单地将一个验证函数列表传递给validators
类的子类中form_args
属性的BaseModelView
参数,但同样,这是每个字段的验证不是正是我想要的。
所以我的问题是:如何一次验证多个字段?
另外,我没有看到任何预保存挂钩事件功能可以执行此操作。我知道on_model_change
但是它是一个后保存钩子,它会破坏验证的目的,将验证放在那里。进行预保存操作的方式是什么?
答案 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;状态。
相关链接: