【发布时间】:2015-08-19 22:55:00
【问题描述】:
我的 SQLAlchemy 模型有一个 String 字段,我想限制为几个选择。
我想知道如何在 Flask-Admin 界面中为该字段创建一个下拉列表,以确保数据库仅填充我的选择之一。如果我让用户手动输入这些字段,他们可能会拼写错误等等。
【问题讨论】:
标签: python flask-admin
我的 SQLAlchemy 模型有一个 String 字段,我想限制为几个选择。
我想知道如何在 Flask-Admin 界面中为该字段创建一个下拉列表,以确保数据库仅填充我的选择之一。如果我让用户手动输入这些字段,他们可能会拼写错误等等。
【问题讨论】:
标签: python flask-admin
enum、form_choices 和 form_args
您的问题是关于在表单级别限制值,但我们也可以在架构级别简要讨论它。
A.在数据库级别限制值:enum 字段
要限制允许值的范围,首先要考虑的是您是否希望数据库为您强制执行。大多数数据库都有一个enum 类型字段,允许您将字段限制为一组值(MySQL、PostGres)。这种方法有利也有弊。在缺点中,这些值可能不会按照您期望的顺序列出;并且每次你想向集合中引入新值时,你都必须修改数据库。
B.使用下拉菜单限制值:form_choices
要创建显示一组允许值的下拉菜单,请创建自定义模型视图并在 form_choices 中定义您的值范围。例如:
class FilmAdmin(sqla.ModelView):
form_choices = { 'now_showing': [ ('0', 'Not Showing'), ('1', 'Showing')],
'color': [('bw', 'Black & White'), ('color', 'Color')]
}
# (many other customizations can go here)
在form_choices 中,您为两个字段创建了下拉列表:now_showing 和color。第一个字段接受值 0 和 1,但为了更容易看,表单将显示 Not Showing 用于 0 和 Showing 用于@ 987654341@.
请注意,这将适用于常规形式,但不适用于 内联形式。
您需要将 ModelView 添加到应用程序中:类似于
admin.add_view(FilmAdmin(yourmodels.Film, db.session))
C.验证:form_args
在内联表单中,您可能没有下拉菜单。但是您可以通过为各种字段定义 WTF 验证器来不断完善您的自定义 ModelView。
正如我们对form_choices 所做的那样,您可以定义一个包含validators 列表的form_args 字典。例如:
# first import the `AnyOf` validator:
from wtforms.validators import AnyOf
class FilmAdmin(sqla.ModelView):
# column_exclude_list = ...
# form_excluded_columns = ...
# form_choices = ...
form_args = {
'flavors': {
'validators': [AnyOf(['strawberry', 'chocolate'])]
}
}
有许多预定义的验证器,您可以定义自己的:请参考flask-admin introduction 和validators section of the WTF documentation。
【讨论】:
enum 有时间和地点。 enum 的存储空间更小(只有一个值的副本),但查找/连接可能更慢(在 High-Performance MySQL 的第 123-124 页讨论,第 3 版。这是一个很好的问题,希望对其他人有所帮助。:)
enum fields in flask-admin,这可能就是您所经历的。目前,flask-admin 似乎有很多 unresolved issues which are not so minor(请参阅 Security thing #1000 等)。您会认为到 2015 年创建管理界面的问题将得到解决,但根本没有。除了花时间手动编写整个代码之外,我还没有找到灵丹妙药,这也让我避免了效率极低的 ORM