假设我MyModelView是普通用户还是超级用户,我想显示不同的列。
MyModelView
覆盖is_accessible在MyModelView已经完全没有效果
is_accessible
from flask_security import Security, SQLAlchemyUserDatastore, current_user class 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
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前面提到的问题继承的任何类。
SafeModelView
dgBaseView
我通常定义视图类属性,例如column_list属性。它允许你向其中添加一些动态逻辑:
column_list
from flask import has_app_context from 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方法中查看此缓存的工作方式。
_list_columns
flask_admin.model.base.BaseModelView._refresh_cache
has_app_context这里需要Flask 方法,因为column_list当current_user变量还没有有意义的值时,第一次读取发生在应用程序启动时。
has_app_context
form_columns属性也可以这样做。这些属性将如下所示:
form_columns
@property def 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