【问题标题】:limit choices with dropdown in flask-admin使用烧瓶管理中的下拉菜单限制选择
【发布时间】:2015-08-19 22:55:00
【问题描述】:

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

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

【问题讨论】:

    标签: python flask-admin


    【解决方案1】:

    enumform_choicesform_args

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

    A.在数据库级别限制值:enum 字段

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

    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_showingcolor。第一个字段接受值 01,但为了更容易看,表单将显示 Not Showing 用于 0Showing 用于@ 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 introductionvalidators section of the WTF documentation

    【讨论】:

    • 最初使用了选项“A”,尽管它会产生大量的噩梦(正如您所提到的)。因此,我将其修改为字符串字段并限制控制器中的条目。
    • 是的,enum 有时间和地点。 enum 的存储空间更小(只有一个值的副本),但查找/连接可能更慢(在 High-Performance MySQL 的第 123-124 页讨论,第 3 版。这是一个很好的问题,希望对其他人有所帮助。:)
    • 顺便说一句,似乎有一个bug with enum fields in flask-admin,这可能就是您所经历的。目前,flask-admin 似乎有很多 unresolved issues which are not so minor(请参阅 Security thing #1000 等)。您会认为到 2015 年创建管理界面的问题将得到解决,但根本没有。除了花时间手动编写整个代码之外,我还没有找到灵丹妙药,这也让我避免了效率极低的 ORM
    • form_choices 和 column_choices 一起使用会更好
    猜你喜欢
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2021-12-14
    • 2020-06-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多