【发布时间】:2014-05-21 17:48:51
【问题描述】:
我正在研究结合 PeeWee 后端 ModelView 的 Flask-Admin(但我的问题也可能适用于 SQLAlchemy 后端),在文档或示例中我找不到两件事:
(1)。当我的模型有一个唯一字段并且我测试/尝试复制它时,我会看到一个默认的 Flask 崩溃屏幕,并显示消息:“IntegrityError: column username is not unique”
我正在测试 https://github.com/mrjoes/flask-admin/blob/master/examples/peewee/simple.py 中提供的 PeeWee 示例,并将第 21 行更改为“username = peewee.CharField(max_length=80, unique=True)”
然后我尝试使用“username”=“user1”添加两个用户。
是否有礼貌的方式返回编辑屏幕(甚至是列表屏幕,任何管理屏幕都会这样做)但带有受控的错误消息?我不需要自定义错误消息,当前消息正常(IntegrityError:列用户名不是唯一的)。但我不想要崩溃屏幕。
我可以设置/使用 Flask 的默认 500 页面,但是我会完全退出 Flask-Admin 流程,用户会“错过”他刚刚输入的数据。
我想回到编辑屏幕,但有一些警告/错误消息。我不介意必须扩展模板,这不是问题。但是我找不到一个地方来拦截错误并正确处理它。有什么建议吗?
和(2):
我还需要一种在流程中添加一些保存前验证的方法。例如,我处于具有 initial_date 和 final_date 的实体的编辑表单中,我想在保存之前确保 final_date 大于 initial_date 或为空。
我可以通过 javascript 在客户端执行此操作,扩展该实体的编辑模板并在尾部添加我的验证脚本(并拦截 form.submit 事件)。
但是如果我的验证需要一些服务器端的最后一分钟验证怎么办?有什么方法/地方可以拦截流程并添加我的验证,并且幸运的是,以问题 1 中讨论的相同方式返回我的错误消息?
提前致谢,
问候,
【问题讨论】:
-
崩溃的原因 - 当 Flask 在调试模式下运行时,Flask-Admin 将重新抛出所有异常(甚至是 IntegrityError)。我将添加 IntegrityError 处理作为此规则的例外。可以在表单或
on_model_change中完成预保存 - 您可以从那里抛出异常。虽然 Werkzeug 调试器会显示异常,但在生产模式下,您会看到很好的错误消息。 -
@Joes
on_model_change是文档中所述的保存后挂钩":"在创建或更新模型之后执行一些操作。在 Flask admin AFAIK 中保存钩子。因此,扩展基表单类和子类中的自定义是回答 OP 问题的唯一方法。 -
@Devy
on_model_change在使用表单数据更新模型时调用,但在会话提交到数据库之前。因此,在那里抛出异常会阻止应用任何更改。
标签: python validation flask-admin flask-peewee