如何在模型类的Flask Admin视图中使字段不可编辑

aja*_*jay 7 python flask flask-admin

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

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

Rem*_* L. 16

您应该从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
        },
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 然而,这也在创建表单中将"名称"标记为已禁用.有没有办法只禁用编辑表单中的字段? (2认同)
  • 是否可以通过某种方式使字段对于“编辑”表单无效,而对“创建”表单启用? (2认同)
  • 'readonly' 仅适用于文本字段。“禁用”将清除所有值(甚至关系)! (2认同)

Phi*_*tin 6

这是一个解决方案,扩展了雷莫的答案和这个答案.它允许使用不同的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)
Run Code Online (Sandbox Code Playgroud)

UserView类

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
    ]
Run Code Online (Sandbox Code Playgroud)

  • 很棒的黑客!但同时它隐藏了表格上的所有其他字段.我是否必须在form_edit_rules中设置它们,或者还有另一种更流畅的方式? (2认同)

tm-*_*tm- 5

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

on_form_prefill(表单,ID)

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

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

换句话说,这是一个触发器,仅在打开 Edit 表单而不是Create表单时运行。

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

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

该方法在应用所有其他规则后运​​行,因此它们都不会被破坏,包括列集。