Flask Admin - 限制自己用户内容的 CRUD 功能
Flask Admin - Restrict CRUD functions for own user content
我想知道是否有人成功限制了 flask admin 的 CRUD 功能。或者这是否是正确的工具。
我想做的是以某种方式转换 ModelView,以便用户只能编辑自己的内容。示例:数据库 table "restaurant menu" 包含不同餐厅提供的菜肴。如果餐厅希望更改某些内容,他们应该能够更改和查看自己的内容,但不能更改和查看其他餐厅的内容。理想情况下,sqlalchemy 有一个简单的方法——我首先查询一个 "User" 模型并获取与用户相关的餐厅,然后将其传递给 ModelView class。
做这样的事情是否有一个简单的实现,或者是否有其他 CMS 系统可以更容易地处理这样的功能?
所以,我更深入地浏览了源代码。非常感谢 gittert 的帮助。
请注意,在我的解决方案中,我确实想限制一个特定列的查看和编辑功能,该列也是来自不同 table 的外键。
因此,为了限制视图功能,我确实重写了 get_query() 和 get_count_query(),因为它已发布在之前的帖子中:
## overwrite
def get_query(self):
self._auto_fush_deactivate()
return super(CustomView,
self).get_query().filter(User.id== 1)
def get_count_query(self):
return self.session.query(func.count('*')).filter(User.id == 1)
并且为了让用户只能使用他在 table 中的 OWN 外键添加新数据,我另外重写了 on_model_create() 函数。
def on_model_change(self, form, model, is_created):
### deactivate auto_flush temp. to not receive data integrity error
self._auto_fush_deactivate()
### create model from table user
overwrite_model = self.session.query(User).filter(User.id== 1).first()
### overwrite the user id with model from User-Model
model.user_id = overwrite_model
self._auto_fush_activate()
def _auto_fush_deactivate(self):
self.session.autoflush = False
def _auto_fush_activate(self):
self.session.autoflush = True
我想知道是否有人成功限制了 flask admin 的 CRUD 功能。或者这是否是正确的工具。
我想做的是以某种方式转换 ModelView,以便用户只能编辑自己的内容。示例:数据库 table "restaurant menu" 包含不同餐厅提供的菜肴。如果餐厅希望更改某些内容,他们应该能够更改和查看自己的内容,但不能更改和查看其他餐厅的内容。理想情况下,sqlalchemy 有一个简单的方法——我首先查询一个 "User" 模型并获取与用户相关的餐厅,然后将其传递给 ModelView class。
做这样的事情是否有一个简单的实现,或者是否有其他 CMS 系统可以更容易地处理这样的功能?
所以,我更深入地浏览了源代码。非常感谢 gittert 的帮助。
请注意,在我的解决方案中,我确实想限制一个特定列的查看和编辑功能,该列也是来自不同 table 的外键。
因此,为了限制视图功能,我确实重写了 get_query() 和 get_count_query(),因为它已发布在之前的帖子中:
## overwrite
def get_query(self):
self._auto_fush_deactivate()
return super(CustomView,
self).get_query().filter(User.id== 1)
def get_count_query(self):
return self.session.query(func.count('*')).filter(User.id == 1)
并且为了让用户只能使用他在 table 中的 OWN 外键添加新数据,我另外重写了 on_model_create() 函数。
def on_model_change(self, form, model, is_created):
### deactivate auto_flush temp. to not receive data integrity error
self._auto_fush_deactivate()
### create model from table user
overwrite_model = self.session.query(User).filter(User.id== 1).first()
### overwrite the user id with model from User-Model
model.user_id = overwrite_model
self._auto_fush_activate()
def _auto_fush_deactivate(self):
self.session.autoflush = False
def _auto_fush_activate(self):
self.session.autoflush = True