django admin根据用户组过滤change_list字段

时间:2011-12-08 12:44:43

标签: python django

我正在使用django admin生成表单以在数据库中包含一些数据,但我需要根据用户组隐藏某些表单字段。

所以,假设我有一个模型如:

class Product(models.Model):
    name = models.CharField(...)
    description = models.CharField(...)
    approved = models.CharField(max_length=1, choices=(('y', 'yes'), ('n','no'), ('w', 'waiting'))

我希望组“基本”组的用户只在表单中看到“名称”和“说明”,而“高级”组的用户也可以看到“已批准”状态。

我是否需要使用自定义模板? 无论你说是或否,请帮助我参考一些文档或一个例子。

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以在ProductAdmin类中覆盖get_form方法。从原始方法:

def get_form(self, request, obj=None, **kwargs):
    ....
    ....
    defaults = {
        "form": self.form,
        "fields": fields,
        "exclude": exclude,
        "formfield_callback": curry(self.formfield_for_dbfield, request=request),
    }
    defaults.update(kwargs)
    ...

因此,您可以动态更改self.form或字段或排除

答案 1 :(得分:1)

您可以在表单中提供__init__方法。在这里,您将可以访问用户对象(如果存在)。根据团队成员资格,您可以自定义表单。

一些片段:

函数签名并获取用户对象:

 def __init__(self,*args, **kwargs):       
        self.user=None
        if kwargs:
            self.user = kwargs.pop('user')

检查用户是否在群组中的功能:

def is_user_in_group(user,group_name):
    return user.groups.filter(name=group_name).count() == 1

隐藏字段的代码段 - 这将使用__init__方法:

self.fields['some_field_to_hide'].widget = widgets.HiddenInput

我要从记忆中走出来,所以请原谅错别字。

答案 2 :(得分:0)

如果您只想隐藏特定字段,同时仍允许更改,则最小解决方案可能是将您的管理员用户添加到新组,并根据组成员身份减少字段。这是一个可重复使用的课程:

class ExternalAdminModelAdmin(admin.ModelAdmin):
    external_admin_group = 'external_admin'
    hidden_fields = []

    def get_form(self, request, obj=None, **kwargs):
        self.fields = [field.name for field in Node._meta.local_concrete_fields if not field.name == 'id']

        if Group.objects.get(name=self.external_admin_group).user_set.filter(id=request.user.id).exists():
            for field_name in self.hidden_fields:
                self.fields.remove(field_name)

        return super(ExternalAdminModelAdmin, self).get_form(request, obj, **kwargs)

您只需要为模型设置隐藏字段属性:

@admin.register(MyModel)
class MyAdmin(ExternalAdminModelAdmin):
    hidden_fields = ['sensitive_field']