【问题标题】:How to make a field non-editable in Flask Admin view of a model class如何在模型类的 Flask Admin 视图中使字段不可编辑
【发布时间】:2014-02-12 11:48:55
【问题描述】:

我有一个User 模型类,password 是众多属性之一。我正在使用 Flask Web 框架和 Flask-Admin 扩展来创建我的模型类的管理视图。我想让管理视图中的某些字段(例如password)不可编辑或根本不显示它们。我该怎么做?

我可以使字段不显示在普通视图中,但是当我单击表中任何记录的编辑按钮时,所有字段都会显示并且是可编辑的。

【问题讨论】:

    标签: python flask flask-admin


    【解决方案1】:

    您应该从 ModelView 扩展您的视图并覆盖必要的字段。

    在我的课堂上是这样的:

    class UserView(ModelView):
    
        column_list = ('first_name', 'last_name', 'username', 'email')
        searchable_columns = ('username', 'email')
    # this is to exclude the password field from list_view:
        excluded_list_columns = ['password']
        can_create = True
        can_delete = False
    # If you want to make them not editable in form view: use this piece:
        form_widget_args = {
            'name': {
                'readonly': True
            },
        }
    

    希望这会有所帮助! 有关更多信息,请查看文档:

    【讨论】:

    • 这也会在创建表单中将“名称”标记为禁用。有没有办法只禁用编辑表单中的字段?
    • 您可能希望使用readonly 属性而不是disabled。后者会导致该字段从提交的表单数据中排除,这可能会导致该字段设置为 None/null,具体取决于您使用的后端。
    • @blurrcat,我也有同样的问题。以下是我想出的解决方案。
    • 是否有可能以某种方式使“编辑”表单的字段禁用但为“创建”表单启用?
    • 'readonly' 仅适用于文本字段。 'disabled' 将清除所有值(甚至关系)!
    【解决方案2】:

    这是一个扩展 Remo 的答案和 so answer 的解决方案。它允许使用不同的 field_args 来编辑和创建表单。

    自定义字段规则类

    from flask_admin.form.rules import Field
    
    class CustomizableField(Field):
        def __init__(self, field_name, render_field='lib.render_field', field_args={}):
            super(CustomizableField, self).__init__(field_name, render_field)
            self.extra_field_args = field_args
    
        def __call__(self, form, form_opts=None, field_args={}):
            field_args.update(self.extra_field_args)
            return super(CustomizableField, self).__call__(form, form_opts, field_args)
    

    用户视图类

    class UserView(ModelView):
    
        column_list = ('first_name', 'last_name', 'username', 'email')
        searchable_columns = ('username', 'email')
    
        # this is to exclude the password field from list_view:
        excluded_list_columns = ['password']
        can_create = True
        can_delete = False
    
        # If you want to make them not editable in form view: use this piece:
        form_edit_rules = [
            CustomizableField('name', field_args={
                'readonly': True
            }),
            # ... place other rules here
        ]
    

    【讨论】:

    • 伟大的黑客!但与此同时,它隐藏了表单上的所有其他字段。我必须在 form_edit_rules 中手动设置它们还是有另一种更流畅的方法?
    • 目前我发现的唯一方法是在form_edit_rules 中手动设置它们。也许如果你发现了改进,你可以在这里分享:)
    • 对答案的要求很高... :) 所以实际上,如果不需要特殊的字段规则(如我的情况),我只需通过任何列列表扩展 form_edit_rules喜欢form_edit_rules.extend(column_list)。并删除加倍的:form_edit_rules.remove('name').
    【解决方案3】:

    解决此问题的另一种方法是使用名为 on_form_prefill 的 Flask-Admin ModelView 方法来设置只读属性参数。根据Flask-Admin Docs

    on_form_prefill(表单,id)

    执行其他操作以预先填写编辑表单。

    从 edit_view 调用,如果当前操作是在执行默认预填充之后呈现表单而不是接收客户端输入。

    换句话说,这是一个触发器,仅在打开编辑表单时运行,不是创建表单。

    因此,上面使用的示例的解决方案是:

    class UserView(ModelView):
        ...
        def on_form_prefill(self, form, id):
            form.name.render_kw = {'readonly': True}
    

    该方法在应用所有其他规则之后运行,因此没有一个被破坏,包括列集。

    【讨论】:

    • 由于方法内部设置了只读属性,我们只能在某些特定情况下应用它,例如根据其他一些字段现有值。这就是我必须在几个月后找到它的原因:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2016-12-11
    • 2011-12-13
    • 2018-01-21
    相关资源
    最近更新 更多