1. 程式人生 > >django 基於proxy實現使用者許可權管理

django 基於proxy實現使用者許可權管理

專案中經常會遇到使用者許可權管理的問題,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中自定義列