Flask-Admin不同的表单和column_list用于不同的角色
假设我MyModelView
是普通用户还是超级用户,我想显示不同的列。
覆盖is_accessible
在MyModelView
已经完全没有效果
from flask_security import Security, SQLAlchemyUserDatastore, current_userclass MyModelView(SafeModelView):
# ...
def is_accessible(self):
if current_user.has_role('superuser'):
self.column_list = superuser_colum_list
self.form_columns = superuser_form_columns
else:
self.column_list = user_colum_list
self.form_columns = user_form_columns
return super(MyModelView, self).is_accessible()
# Has same effect as
def is_accessible(self):
return super(MyModelView, self).is_accessible()
并且定义条件类属性也不起作用current_user
(未定义)(根据current_user.is_authenticated()
上AttributeError
的NoneType
错误)。在等效的ModelView
中做同样的事情,仍然没有定义__init__current_user
class MyModelView(SafeModelView): #[stuff]
if current_user.has_role('superuser'):
column_list = superuser_colum_list
form_columns = superuser_form_columns
else:
column_list = user_colum_list
form_columns = user_form_columns
#[other stuff]
仅供参考,SafeModelView
可以是从dgBaseView
前面提到的问题继承的任何类。
回答:
我通常定义视图类属性,例如column_list
属性。它允许你向其中添加一些动态逻辑:
from flask import has_app_contextfrom flask_security import current_user
class MyModelView(SafeModelView):
@property
def column_list(self):
if has_app_context() and current_user.has_role('superuser'):
return superuser_column_list
return user_column_list
@property
def _list_columns(self):
return self.get_list_columns()
@_list_columns.setter
def _list_columns(self, value):
pass
使用这种方法的问题(以及为什么column_list
在is_accessible
函数中重新分配值不起作用)是许多视图属性在应用程序启动时被缓存并存储在私有属性中。column_list
例如,缓存在_list_columns
属性中,因此你也需要重新定义它。你可以在flask_admin.model.base.BaseModelView._refresh_cache
方法中查看此缓存的工作方式。
has_app_context
这里需要Flask 方法,因为column_list
当current_user
变量还没有有意义的值时,第一次读取发生在应用程序启动时。
form_columns
属性也可以这样做。这些属性将如下所示:
@propertydef form_columns(self):
if has_app_context() and current_user.has_role('superuser'):
return superuser_form_columns
return user_form_columns
@property
def _create_form_class(self):
return self.get_create_form()
@_create_form_class.setter
def _create_form_class(self, value)
pass
@property
def _edit_form_class(self):
return self.get_edit_form()
@_edit_form_class.setter
def _edit_form_class(self, value):
pass
以上是 Flask-Admin不同的表单和column_list用于不同的角色 的全部内容, 来源链接: utcz.com/qa/426784.html