Python 使用flask admin中的下拉列表限制选项
我的SQLAlchemy模型有一个Python 使用flask admin中的下拉列表限制选项,python,flask-admin,Python,Flask Admin,我的SQLAlchemy模型有一个字符串字段,我想将其限制为几个选项 我想知道如何在Flask Admin界面中为这个字段创建一个下拉列表,以确保db只填充我的一个选项。如果我让用户手动输入这些字段,它们可能会拼写错误,等等。enum、表单选项和表单参数 您的问题是关于在表单级别限制值,但我们也可以在模式级别简要讨论它 A.在数据库级别限制值:enum字段 为了限制允许值的范围,首先要考虑的是您是否希望数据库为您执行该值。大多数数据库都有一个enumtype字段,允许您将字段限制为一组值(,)。
字符串
字段,我想将其限制为几个选项
我想知道如何在Flask Admin界面中为这个字段创建一个下拉列表,以确保db只填充我的一个选项。如果我让用户手动输入这些字段,它们可能会拼写错误,等等。enum
、表单选项
和表单参数
您的问题是关于在表单级别限制值,但我们也可以在模式级别简要讨论它
A.在数据库级别限制值:enum
字段
为了限制允许值的范围,首先要考虑的是您是否希望数据库为您执行该值。大多数数据库都有一个
enum
type字段,允许您将字段限制为一组值(,)。这种方法有优点也有缺点。在缺点中,值可能没有按您期望的顺序列出;每次您想要向集合中引入新值时,都必须修改数据库
B.使用下拉列表限制值:form\u选项
要创建显示一组允许值的下拉列表,请创建自定义模型视图,并在表单\u选项中定义您的值范围。例如:
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)
# 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'])]
}
}
在form\u choices
中,您为两个字段创建了下拉列表:now\u showing
和color
。第一个字段允许值0
和1
,但为了便于眼睛观看,表单将显示不显示0
和显示1
请注意,这将在常规表单中工作,但不会在内联表单中工作
您需要将ModelView添加到应用程序中:类似
admin.add\u视图(FilmAdmin(yourmodels.Film,db.session))
C.验证:表单参数
在内联表单中,您可能没有下拉列表。但是,您可以通过为各个字段定义WTF验证器来不断改进自定义ModelView
正如我们使用表单选项
所做的那样,您可以定义一个表单参数
字典,其中包含一个验证程序
列表。例如:
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)
# 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'])]
}
}
有许多预定义的验证器,您可以定义自己的验证器:请参阅和。选项“A”最初被使用,尽管它会造成许多噩梦(如您所述)。因此,我将其修改为字符串字段并限制控制器中的条目。是的,enum
有一个时间和地点。使用enum
(仅值的一个副本)时,存储空间更小,但查找/连接速度可能会更慢(在High Performance MySQL第三版第123-124页讨论。这是一个好问题,希望对其他人有所帮助。:)顺便说一句,似乎存在一个可能是您所经历的问题。目前,flask管理员似乎有很多(请参阅安全问题#1000和其他)。您可能会认为,到2015年,创建管理接口的问题将得到解决,但根本没有解决。除了花时间手工编写代码之外,我还没有找到银弹,这也让我避免了极其低效的ORMuse表单和列选项,这样会更好