Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django admin筛选器根据用户组更改列表字段_Python_Django - Fatal编程技术网

Python django admin筛选器根据用户组更改列表字段

Python django admin筛选器根据用户组更改列表字段,python,django,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'),

我正在使用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'))
如果我希望组“基本”的用户仅在表格中看到“名称”和“说明”,而组“高级”的用户也可以看到“批准”状态

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


谢谢。

您可以在表单中提供一个
\uuuu init\uu
方法。在这里,您可以访问用户对象(如果存在)。根据团队成员,您可以自定义表单

一些片段:

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

 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
使字段隐藏的代码段——这将在
\uuuuu init\uuuu
方法中:

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

我是从这里的记忆出发的,所以请原谅输入错误。

您可以在表单中提供一个
\uuu init\uu
方法。在这里,您可以访问用户对象(如果存在)。根据团队成员,您可以自定义表单

一些片段:

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

 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
使字段隐藏的代码段——这将在
\uuuuu init\uuuu
方法中:

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

我在这里是从内存中提取的,所以请原谅输入错误。

您可以在ProductAdmin类中重写get\u 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或字段,或者排除

您可以覆盖ProductAdmin类中的get\u 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或fields,也可以排除这些字段。在允许更改的情况下,最简单的解决方案可能是将管理员用户添加到新组中,并根据组成员资格减少字段。下面是一个可重用的类:

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']

如果您只想隐藏特定字段,而仍然允许更改,那么最简单的解决方案可能是将管理员用户添加到新组,并根据组成员资格减少字段。下面是一个可重用的类:

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']

thnx,非常有帮助的解释:)thnx,非常有帮助的解释:)谢谢你的这份报告,我将了解更多关于文档的信息!谢谢你的这份报告,我将了解更多关于医生的信息!