我们正在使用django开发客户管理应用程序,我们需要为代理设置权限,无论他/她是否可以编辑客户的属性()。
例如,
如果我有模特:
class Customer(models.Model):
# basic information
name = models.CharField(max_length=150) # the name of this customer
date = models.DateField(auto_now_add=True) # the date that this customer is created
# personal information
citizen_id = models.BigIntegerField(blank=True)
phone = models.BigIntegerField(max_length=20, blank=True)
work = models.CharField(max_length=100, blank=True)
address = models.CharField(max_length=300, blank=True)
bank_card = models.BigIntegerField()
# installation detail
primary = models.IntegerField(default=0)
secondary = models.IntegerField(default=0)
region = models.ForeignKey(Region) # the region that this customer currently lives in
type = models.ForeignKey(Type) # the installation type
group = models.ForeignKey(Group)
STATUS_CHOICES = (
('Active', 'Active'),
('Inactive', 'Inactive'),
('Transfered', 'Transfered'),
('Closed', 'Closed'),
('Suspended', 'Suspended'),
('Cancelled', 'Cancelled'),
)
status = models.CharField(max_length=40, choices=STATUS_CHOICES)
我希望能够设置编辑某些字段的权限,但是当前的权限系统只允许您添加/更改/删除模型实例,其中“更改”允许用户编辑所有属性在那个模型中,这不是我们真正想要的。
用户A可以编辑电话,地址,工作和citizen_id 用户B只能编辑电话和地址, 用户C可以编辑citizen_id,..... 等...
我希望能够设置不同的权限
是否有可能实现这一目标?如果我可以使用django管理系统来管理代理和客户,那将非常有用。
======================= 非常感谢FallenAngel的回复。
我认为这正是我们想要的。
这是我尝试过的,
在admin.py中
class CustomerAdmin(admin.ModelAdmin):
def change_view(self, request, object_id, extra_context=None):
agent = Agent.object.get(user=request.user)
permitted_fields = agent.permitted_fields # assume i have this setup...
self.readonly_fields = get_not_permitted_fields(premitted_fields) # assume I have this function written somewhere
return super(CustomerAdmin, self).change_view(request, object_id,
extra_context=None)
这完全符合我的要求:对于不允许的字段,将它们设置为只读...
再次感谢,
答案 0 :(得分:3)
这是可能的......您必须使用django管理方法as they described in here ...您必须定义add_view,change_view和changelist_view函数......
您还必须找到一种分组用户的方法(组可能是一种好方法,或者您可以使用权限)。我创建了一个扩展用户模型的模型,但你可以找到自己的方式......
第二次编写基本的添加,更改和列表视图功能,如:
class CustomerAdmin(admin.ModelAdmin):
list_display= ["fields that will be used for all users"]
def changelist_view(self, request, extra_context=None):
if request.user == "type a":
self.list_display.extend["list of other fields"]
return super(CustomerAdmin, self).changelist_view(request, extra_context)
您必须指定添加,更改(和更改列表,如果需要)视图并处理每个用户类型。然后Django将为用户显示相关字段。你扩展了list_display,fileds,exclude,list_filter和这样的django管理字段显示方法......