12

我正在研究结合 PeeWee 后端 ModelView 的 Flask-Admin(但我的问题也可能适用于 SQLAlchemy 后端),在文档或示例中我找不到两件事:

(1)。当我的模型有一个唯一字段并且我测试/尝试复制它时,我会得到一个默认的 Flask 崩溃屏幕,并显示消息:“IntegrityError:列用户名不是唯一的”

我正在测试https://github.com/mrjoes/flask-admin/blob/master/examples/peewee/simple.py中提供的 PeeWee 示例,并将第 21 行更改为“username = peewee.CharField(max_length= 80,唯一=真)”

然后我尝试用“username”=“user1”添加两个用户。

有没有一种礼貌的方法可以返回编辑屏幕(甚至是列表屏幕,任何管理屏幕都可以)但带有受控的错误消息?我不需要自定义错误消息,当前消息正常(IntegrityError:列用户名不是唯一的)。但我不想要崩溃屏幕。

我可以设置/使用 Flask 的默认 500 页面,但是我会完全退出 Flask-Admin 流程,用户会“错过”他刚刚输入的数据。

我想回到编辑屏幕,但有某种警报/错误消息。我不介意必须扩展模板,这不是问题。但是我找不到一个地方来拦截错误并正确处理它。有什么建议么?

(2):

我还需要一种在流程中添加一些预保存验证的方法。例如,我处于具有 initial_date 和 final_date 的实体的编辑表单中,我想在保存之前确保 final_date 大于 initial_date 或为空。

我可以通过 javascript 在客户端执行此操作,扩展该实体的编辑模板并在尾部块中添加我的验证脚本(并拦截 form.submit 事件)。

但是,如果我的验证需要一些服务器端的最后一分钟验证怎么办?有什么方法/地方可以拦截流程并添加我的验证,幸运的是,以问题 1 中讨论的相同方式返回我的错误消息?

提前致谢,

问候,

4

1 回答 1

23

我想我找到了一些有用的东西,但不能完全回答我的问题。

我在 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])
)

该验证器接收“表单”和“字段”,因此我可以进行涉及多个字段的验证(例如开始日期 < 完成日期),并且我什至可以访问模型类以检查 id 重复。

因此,这解决了创建/编辑验证。如果验证器失败,Flask-Admin 会将我带回已填充的编辑表单。好的!

但是删除有问题。如果我不想删除特定对象,我可以将其标记为 can_delete = False,但这会阻止删除任何实例。

我能找到的最好方法是拦截 delete_model 方法(第 55 行)并在预删除验证失败的情况下返回 False。但这不会引发任何信息,只会让我回到表格中。我无法向用户发送他无法删除该特定实例的消息。

我会继续学习,并会发布任何进一步的消息。

谢谢!

于 2014-04-14T19:44:49.773 回答