Python 使用flask admin中的下拉列表限制选项

Python 使用flask admin中的下拉列表限制选项,python,flask-admin,Python,Flask Admin,我的SQLAlchemy模型有一个字符串字段,我想将其限制为几个选项 我想知道如何在Flask Admin界面中为这个字段创建一个下拉列表,以确保db只填充我的一个选项。如果我让用户手动输入这些字段,它们可能会拼写错误,等等。enum、表单选项和表单参数 您的问题是关于在表单级别限制值,但我们也可以在模式级别简要讨论它 A.在数据库级别限制值:enum字段 为了限制允许值的范围,首先要考虑的是您是否希望数据库为您执行该值。大多数数据库都有一个enumtype字段,允许您将字段限制为一组值(,)。

我的SQLAlchemy模型有一个
字符串
字段,我想将其限制为几个选项

我想知道如何在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表单和列选项,这样会更好