Django ModelAdmin对字段集的请求/用户限制(需要线程安全)

时间:2012-08-01 17:44:49

标签: django django-admin django-modeladmin

我有几个非常自定义的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页面,您会在表单中看到多个“group”或“is_live”字段。

我真的很喜欢利用管理员让我不必编写所有内容,但我无法找到如何正确执行此操作。任何帮助或建议将不胜感激!

1 个答案:

答案 0 :(得分:2)

问题在于,即使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)