我通常定义视图类属性,例如
column_list属性。它允许您向其中添加一些动态逻辑:
from flask import has_app_contextfrom flask_security import current_userclass 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@propertydef _create_form_class(self): return self.get_create_form()@_create_form_class.setterdef _create_form_class(self, value) pass@propertydef _edit_form_class(self): return self.get_edit_form()@_edit_form_class.setterdef _edit_form_class(self, value): pass


