我正在使用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'))
我希望组“基本”组的用户只在表单中看到“名称”和“说明”,而“高级”组的用户也可以看到“已批准”状态。
我是否需要使用自定义模板? 无论你说是或否,请帮助我参考一些文档或一个例子。
谢谢。
答案 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']