Dev*_*evy 5 python sqlalchemy flask flask-wtforms flask-admin
我一直打算创建一个基于多个字段值的自定义表单验证逻辑(在我的情况下,为确保确保日期范围数据的完整性,有2个字段,即IE start_time <end_time)。但是,翻阅Flask管理站点上的文档,我找不到任何地方可以做这种事情。我知道您可以轻松地将验证函数列表传递给类的子类中属性的validators
参数,但是同样,按字段验证也不完全是我想要的。form_args
BaseModelView
所以我的问题是:如何一次验证多个字段?
另外,我看不到任何预保存的钩子事件函数可以执行此操作。我知道,on_model_change
但是那是一个保存后的钩子,它会破坏将验证放在其中的验证目的。进行预保存动作的合适方式是什么?
因此,在尝试并尝试了几种不同的方法之后,我进行多次表单域验证的方式仍然是固定的,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)
您可以通过使用继承和自定义“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 方法更自然的表单验证地方,它不应该关注模型逻辑,而不是表单验证逻辑。另外,请注意我们不需要使用异常并依赖于逆转事务。我们只是在任何事务发生之前捕获错误,闪现一条错误消息并优雅地返回“假”状态。
相关链接:
归档时间: |
|
查看次数: |
3306 次 |
最近记录: |