Flask Admin-为自己的用户内容限制CRUD功能

时间:2018-12-19 12:12:29

标签: flask sqlalchemy flask-sqlalchemy crud flask-admin

我想知道是否有人成功限制了flask admin的CRUD功能。或者,如果这根本是正确的工具。

我想做的是以某种方式转换ModelView,以便用户只能编辑自己的内容。示例:数据库表“餐厅菜单”包含不同餐厅提供的菜肴。如果一家餐厅希望更改某些内容,则他们应该能够更改并查看自己的内容,但不能更改其他餐厅的内容。理想情况下,使用sqlalchemy有一种简单的方法-我首先查询“用户”模型并获取与用户相关联的餐厅,然后将其传递给ModelView类。

做这样的事情是否容易实现?是否有其他CMS系统可以更轻松地处理这种功能?

1 个答案:

答案 0 :(得分:0)

因此,我更深入地研究了源代码。非常感谢gittert的帮助。

请注意,在我的解决方案中,我确实希望限制某一列的“查看和编辑”功能,这也是来自不同表的外键。

因此,为了限制视图功能,我确实重写了先前文章中发布的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)

为了使用户只能使用表中的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