使用 flask-admin 中的下拉列表限制选择

limit choices with dropdown in flask-admin

我的 SQLAlchemy 模型有一个 String 字段,我想将其限制为几个选择。

我想知道如何在 Flask-Admin 界面中为这个字段创建一个下拉列表,以确保数据库只填充我的选择之一。如果我让用户手动输入这些字段,他们可能会拼写错误等等

enumform_choicesform_args

您的问题是关于在表单级别限制值,但我们也可以在模式级别简要讨论它。

一个。在数据库级别限制值:enum 字段

要限制允许值的范围,首先要考虑的是您是否希望数据库为您强制执行。大多数数据库都有一个 enum 类型字段,允许您将字段限制为一组值 (MySQL, PostGres)。这种方法有利也有弊。在缺点中,值可能不会按照您期望的顺序列出;每次你想向集合中引入新值时,你都必须修改数据库。

乙。使用下拉列表限制值: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_showingcolor。第一个字段接受值 01,但为了让眼睛更容易看,表单将显示 Not Showing for 0显示 1

请注意,这将适用于常规形式,但不适用于 内联形式

您需要将 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 and to the validators section of the WTF documentation