我有一个User
模型类,password
是众多属性之一。我正在使用 Flask Web 框架和 Flask-Admin 扩展来创建我的模型类的管理视图。我想让管理视图中的某些字段像password
不可编辑或根本不显示它们。我该怎么做?
我可以使字段不显示在普通视图中,但是当我单击表中任何记录的编辑按钮时,所有字段都会显示并且是可编辑的。
我有一个User
模型类,password
是众多属性之一。我正在使用 Flask Web 框架和 Flask-Admin 扩展来创建我的模型类的管理视图。我想让管理视图中的某些字段像password
不可编辑或根本不显示它们。我该怎么做?
我可以使字段不显示在普通视图中,但是当我单击表中任何记录的编辑按钮时,所有字段都会显示并且是可编辑的。
您应该从 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
},
}
希望这可以帮助!有关更多信息,请查看文档:
这是一个扩展 Remo 的答案和这个答案的解决方案。它允许使用不同的 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
]
解决该问题的另一种方法是使用调用的 Flask-Admin ModelView 方法on_form_prefill
来设置只读属性参数。根据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}
该方法在应用了所有其他规则之后运行,因此它们都没有被破坏,包括列集。