Python django admin筛选器根据用户组更改列表字段
我正在使用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'),
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,非常有帮助的解释:)谢谢你的这份报告,我将了解更多关于文档的信息!谢谢你的这份报告,我将了解更多关于医生的信息!