根据登录用户隐藏Flask-Admin中的字段?

时间:2016-05-30 20:05:44

标签: python flask flask-admin flask-security

感谢Flask-Security,我的Flask应用中有UsersRoles

对于某些角色,我想隐藏Flask-Admin创建的表单中的某些字段。

我知道用例如自定义ModelViews。 form_create_rules = ('title', 'file')但在实例化ModelView时,无法访问当前请求,因此无法调用current_user.has_role(USER_ROLE)

还有其他方法可以达到这个目的吗?

1 个答案:

答案 0 :(得分:5)

实现此目的的一种方法是创建多个视图类并根据其适当的角色注册这些视图类。有关如何向视图注册角色,请参阅此answer。使用视图继承,您可以在" base"中保留常用功能。类。

例如,假设我们有一个实现Flask-Security mixin的用户表,我们想要角色" admin"能够读取/设置活动字段以及任何具有角色" user"不要看这个领域。类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"]))