您的位置:首页 > 编程语言 > Go语言

django 基于proxy实现用户权限管理

2015-11-05 17:32 721 查看
项目中经常会遇到用户权限管理的问题,django adminsite已经提供非常实用的用户权限管理机制。不过有些时候,我们希望根据相关用户属性来过滤adminsite中显示的内容。下文将结束如何实现:


原始类

假设我有这么一个问卷类,基于这个类可以实现增删改查的功能

class wenjuan(models.Model):
"""
问卷
"""

name=models.CharField(u'问卷名称',max_length=128)
breif=models.TextField(u'问卷简介')
zhichixinxi=models.TextField(u'支持信息',default=u'技术支持',null=True,blank=True)
danwei=models.ForeignKey(Department, verbose_name=u'所属单位')
status = models.SmallIntegerField(choices=WENJUAN_STATUS, verbose_name=u'状态')
fabu_time = models.DateTimeField(verbose_name=u'发布日期',null=True,blank=True)
jiezhi_time = models.DateTimeField(verbose_name=u'截止日期',null=True,blank=True)
create_time = models.DateTimeField(auto_now=True, verbose_name=u'创建日期',null=True,blank=True)
cjUser=models.ForeignKey(Users,related_name='users_cj',  verbose_name=u'所属用户',null=True,blank=True)

def __unicode__(self):
return self.name

class Meta:
verbose_name = u"问卷"
verbose_name_plural = verbose_name
#app_label = _(u'b')


子类

基于子类实现根据权限进行不同显示,在demo项目中,我们将实现用户只能查询自己的创建的问卷

class  chakanWenjuan(wenjuan):
class Meta:
proxy=True
verbose_name=_(u'统计结果')
verbose_name_plural=_(u'统计结果')


xadminx中,我们需要设置一下queryset 过滤

#-------------------------------------------------
class chakanWenjuanAdmin(object):
list_display = ('name','danwei','cjUser',)
reversion_enable = True
search_fields = ['name',]

def queryset(self):
qs = super(chakanWenjuanAdmin, self).queryset()
if self.user.is_superuser:
return qs
else:
myuser=Users.objects.get(user__id=self.user.id)
return qs.filter(cjUser=myuser)

xadmin.site.register(chakanWenjuan,chakanWenjuanAdmin)


如果是超级用户,那么全部显示。如果是普通用户,根据user进行筛选。

预告

下一篇将介绍,如何在adminsite中自定义列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: