2011-12-08 107 views
0

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

所以,让我们说我有一个型号,如:

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

,我想该组的用户的“基本”看到窗体唯一的“名称”和“说明”和用户该组“高级”也参见“批准”状态。

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

谢谢。

回答

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或字段或排除

+0

谢谢你的这个报告,我将详细了解该文档! –

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 

我想从这里回忆,所以请原谅错别字。

+0

日Thnx,非常有帮助的解释:) –

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'] 
相关问题