python - Flask-Admin ModelView 自定义验证?

标签 python validation flask-admin flask-peewee

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

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

我正在测试 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 在客户端执行此操作,扩展该实体的编辑模板并在尾 block 中添加我的验证脚本(并拦截 form.submit 事件)。

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

提前致谢,

问候,

最佳答案

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

我在 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。但这不会引发任何信息,只会让我回到表格。我找不到任何方法向用户发送消息,告知他无法删除该特定实例。

我会继续研究并发布任何进一步的消息。

谢谢!

关于python - Flask-Admin ModelView 自定义验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22947083/

相关文章:

python - App Engine memcache/ndb.get_multi 的性能问题

python - Flask-Admin 扩展模板

python - 如何编辑flask-admin以支持 Multi-Tenancy ?

python - 'greater than or equal' 集合与字符之间的比较如何工作

python - MessagePack 和消息帧

java - 在 Java 中检查一行是否有效

forms - 没有提交按钮验证 Magento 中的表单元素

validation - grails 2.4.2 - 域对象验证的时间点

python - 在 Flask-Admin 中修改输入字段大小

python - 获取 Python 对象作为变体