我正在研究Flask-Admin和PeeWee Backend ModelView(但我的问题也可能适用于SQLAlchemy后端),并且在文档或示例中我找不到两件事:
(1)。当我的模型有一个唯一的字段并且我测试/尝试复制它时,我得到一个默认的Flask崩溃屏幕,并显示消息:“IntegrityError:column username 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或为null。
我可以通过javascript执行此客户端,扩展该实体的编辑模板并在尾部块中添加我的验证脚本(并拦截form.submit事件)。
但是,如果我的验证需要一些服务器端的最后一分钟验证呢?是否有任何方法/地方拦截流程并添加我的验证,运气好的话,以问题1中讨论的相同方式抛出我的错误信息?
提前感谢,
的问候,
答案 0 :(得分:17)
我想我发现了一些有用的东西,但不能完全回答我的问题。
我在PasteBin上发布了一个示例:http://pastebin.com/siwiaJAw
首先,在保存之前我找不到'一步,但我已经找到了如何添加字段级自定义验证,这有助于创建和更新。
如果你查看这个例子,你会看到我添加的第37-39行和第42-44行:
def no_root_allowed(form, field):
if field.data == 'root':
raise ValidationError('"root" is not allowed')
form_args = dict(
username=dict(validators=[no_root_allowed])
)
此验证工具会收到“'表格'和' field'所以我可以进行涉及多个字段的验证(比如开始日期和完成日期),我甚至可以访问Model类来检查id复制,例如。
因此,这解决了创建/编辑验证。如果验证器失败,Flask-Admin会将我带回已经填充的编辑表单。尼斯!
但是删除存在问题。如果我不想删除特定对象,我可以将其标记为can_delete = False,但这会阻止任何实例被删除。
我能找到的最好的方法是截取delete_model方法(第55行),如果删除前验证失败则返回False。但这不会引起任何信息,只会让我回到表格。我找不到向用户发送消息的消息,他无法删除该特定实例。
我会继续学习,并会发布更多新闻。
谢谢!