我的SQLAlchemy模型有一个String
字段,我想限制几个选项。
我想知道如何在Flask-Admin界面中为此字段创建一个下拉列表,以确保只使用我的一个选项填充数据库。如果我让用户手动输入这些字段,他们可能会拼写错误等等。
答案 0 :(得分:23)
enum
,form_choices
和form_args
您的问题是关于在表单级别限制值,但我们也可以在架构级别简要讨论它。
:一种。限制数据库级别的值:enum
字段
要限制允许值的范围,首先要考虑的是您是否希望数据库为您强制执行该操作。大多数数据库都有enum
类型字段,您可以将字段限制为一组值(MySQL,PostGres)。这种方法有利有弊。在缺点中,值可能不按您期望的顺序列出;每次要为集合引入新值时,都必须修改数据库。
<强> B中。使用下拉菜单限制值:form_choices
要创建显示一组允许值的下拉列表,请创建自定义的ModelView并在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
,但为了方便用户,表单将显示{em> Not Showing 0
和显示代表1
。
请注意,这将以常规形式运行,但不能以内联形式运行。
您需要将ModelView添加到应用程序:类似
admin.add_view(FilmAdmin(yourmodels.Film, db.session))
<强>℃。验证:form_args
在内联表单中,您可能没有下拉列表。但您可以通过为各个字段定义WTF验证器来不断优化自定义ModelView。
正如我们对form_choices
所做的那样,您可以定义包含form_args
列表的validators
字典。例如:
# 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。