的Django的ModelAdmin与在字段集请求/基于用户的限制(需要被线程安全)(Django

2019-10-17 02:16发布

我有几个非常个性化的Django ModelAdmins,我想补充额外的字段(一个或多个),如果用户是超级用户。 我发现的地方,有人说重写get_fieldsets方法是这样

def get_fieldsets(self, request, obj=None):
    fieldsets = super(PageAdmin, self).get_fieldsets(request, obj)
    if request.user.is_superuser:
        fieldsets[0][1]['fields'].insert(0,'group')
        fieldsets[0][1]['fields'].insert(2,'is_live')
    else:
        groups = request.user.page_groups.filter(
            is_live = True,
        )
        if groups.count() > 1:
            fieldsets[0][1]['fields'].insert(0,'group')
    return fieldsets

这工作(那种),我喜欢使用get_fieldsets,因为它让我组的字段到字段集。 我也用get_form这个管理员,因为形式有具有基于用户的查询集多个用户特定的表单字段。

def get_form(self, request, obj=None, **kwargs):
    if request.user.is_superuser:
        return PageForm
    else:
        form = RestrictedPageForm
        form.owner = request.user #(this may be a bad way to do this but it works I think)
        return form

现在我遇到了我认为是线程的问题。

什么情况是,如果你快速刷新change_form页面在浏览器中,您将看到多个“集团”或形式“is_live”领域。

我真的很喜欢利用管理员让我不必写的一切,但我不能找出如何正确地做到这一点。 任何帮助或建议将不胜感激!

Answer 1:

问题是,你从字面上改变fieldsets的属性ModelAdmin ,这是不是线程安全的,即使get_fieldsets

要做到这一点,最好的方法是指定单独的字段集:

fieldsets = (...)
restricted_fieldsets = (...)

然后:

def get_fieldsets(self, request, obj=None):
    if some_condition:
        return self.restricted_fieldsets
    else:
        return super(MyModelAdmin, self).get_fieldsets(request, obj=obj)


文章来源: Django ModelAdmin with request/user based restrictions on the fieldsets (needs to be Thread Safe)