根据登录用户隐藏 Flask-Admin 中的字段?
Hiding fields in Flask-Admin depending on logged in user?
感谢 Flask-Security,我的 Flask 应用程序中有 Users
和 Roles
。
对于某些角色,我想隐藏 Flask-Admin 创建的表单中的某些字段。
我知道如何使用例如自定义 ModelView。 form_create_rules = ('title', 'file')
但是在实例化 ModelView 时无法访问当前请求,因此无法调用 current_user.has_role(USER_ROLE)
。
还有其他方法可以实现吗?
实现此目的的一种方法是创建多个视图 classes 并根据其适当的角色注册这些视图 classes。请参阅此 ,了解如何将角色注册到视图。使用视图继承,您可以在 "base" class.
中保留常用功能
例如,假设我们有一个用户 table 实现了 Flask-Security mixin,我们希望角色 "admin" 能够 read/set 活动字段和任何具有作用 "user" 看不到这个字段。 class AdminView
在引用的答案中定义。
class AdminUserView(AdminView):
column_list = ['first_name', 'last_name', 'email', 'roles', 'active']
form_columns = ['first_name', 'last_name', 'email', 'active', 'roles']
# Other common functionality here
class UserView(AdminUserView):
# Just redefine the columns that can be seen/edited
column_list = ['first_name', 'last_name', 'email', 'roles']
form_columns = ['first_name', 'last_name', 'email', 'roles']
# register your views and remember to set a unique endpoint as we are using the same model in multiple views
admin.add_view(AdminUserView(model=User, session=db.session, category="Accounts", name="Users", endpoint="users_admin", roles_accepted=["admin"]))
admin.add_view(UserView(model=User, session=db.session, category="Accounts", name="Users", endpoint="users_user", roles_accepted=["user"]))
感谢 Flask-Security,我的 Flask 应用程序中有 Users
和 Roles
。
对于某些角色,我想隐藏 Flask-Admin 创建的表单中的某些字段。
我知道如何使用例如自定义 ModelView。 form_create_rules = ('title', 'file')
但是在实例化 ModelView 时无法访问当前请求,因此无法调用 current_user.has_role(USER_ROLE)
。
还有其他方法可以实现吗?
实现此目的的一种方法是创建多个视图 classes 并根据其适当的角色注册这些视图 classes。请参阅此
例如,假设我们有一个用户 table 实现了 Flask-Security mixin,我们希望角色 "admin" 能够 read/set 活动字段和任何具有作用 "user" 看不到这个字段。 class AdminView
在引用的答案中定义。
class AdminUserView(AdminView):
column_list = ['first_name', 'last_name', 'email', 'roles', 'active']
form_columns = ['first_name', 'last_name', 'email', 'active', 'roles']
# Other common functionality here
class UserView(AdminUserView):
# Just redefine the columns that can be seen/edited
column_list = ['first_name', 'last_name', 'email', 'roles']
form_columns = ['first_name', 'last_name', 'email', 'roles']
# register your views and remember to set a unique endpoint as we are using the same model in multiple views
admin.add_view(AdminUserView(model=User, session=db.session, category="Accounts", name="Users", endpoint="users_admin", roles_accepted=["admin"]))
admin.add_view(UserView(model=User, session=db.session, category="Accounts", name="Users", endpoint="users_user", roles_accepted=["user"]))