django admin實現(xiàn)后臺多用戶隔離

很多人說django自帶的后臺只能用來做管理,其實簡單的多用戶發(fā)布需求還是可以用自帶的admin模塊來做的。核心是使用request.user獲取當(dāng)前登錄用戶,然后根據(jù)用戶篩選后臺顯示內(nèi)容。

復(fù)雜的用戶權(quán)限管理使用django-guardian等組件

模擬了一個根據(jù)用戶每天輸入的數(shù)據(jù),生成可視化報表的項目。預(yù)想的是根據(jù)不同的報表類型,預(yù)設(shè)不同的數(shù)據(jù)模板。前端請求的時候發(fā)送報表類型和數(shù)據(jù)范圍用戶等信息到后端。后端返回數(shù)據(jù)后交給前端echart處理。

花了整個下午才完成基本的后臺,因為目的是實現(xiàn)多用戶,后面的部分有空再去寫。

  1. 先設(shè)置一般用戶的group,配置好權(quán)限,所有新建用戶都是用一般的權(quán)限。權(quán)限設(shè)置看文檔
  2. 隔離列表頁
    列表頁隔離,使用get_queryset方法,這個比較好實現(xiàn),資料也多
class NoteAdmin(admin.ModelAdmin):
    def get_queryset(self,request):
        qs = super(NoteAdmin,self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        # 此處user為當(dāng)前model的related object的related object, 正常的外鍵只要filter(user=request.user)
        return qs.filter(fordata__user=request.user)
    list_display = ('title','fordata')
    search_fields = ('title','fordata')
  1. 隔離增加和修改數(shù)據(jù)時顯示的related object項目

![HTZMQ)4(7BXHAD`K~F]QSLR.png](http://upload-images.jianshu.io/upload_images/923222-cb82053c32efc77e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

創(chuàng)建和修改model時,會顯示關(guān)聯(lián)的外鍵的所有的值,比如顯示出所有的用戶來了。使用get_form方法隱藏外鍵字段(例如user),save_model設(shè)置user默認(rèn)值,也別忘了列表頁的篩選get_queryset

class CustomTypeAdmin(admin.ModelAdmin):
    def save_model(self,request,obj,form,change):
        obj.user = request.user
        obj.save()

    def get_form(self,request,obj=None,**kwargs):
        self.exclude = ("user",)
        form = super(CustomTypeAdmin,self).get_form(request, obj, **kwargs)
        return form
    fields = ('typename','ordernum')
    list_display = ('typename','ordernum')
    list_editable = ('ordernum',)
    def get_queryset(self,request):
        qs = super(CustomTypeAdmin,self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(user=request.user)

附:最基本的幾個model代碼

class CustomType(models.Model):
    typename = models.CharField(max_length=50,verbose_name='報表名')
    user = models.ForeignKey(User,verbose_name='用戶',on_delete=models.CASCADE)
    ordernum = models.IntegerField()
    def __unicode__(self):
        return self.typename
    class Meta:
        verbose_name = '報告分類'
        verbose_name_plural = '報告分類'
class DailyData(models.Model):
    add_date = models.DateField(default=timezone.now,verbose_name='日期')
    record = models.FloatField(verbose_name='數(shù)據(jù)')
    user = models.ForeignKey(User,verbose_name='用戶',on_delete=models.CASCADE)
    type = models.ForeignKey(CustomType,verbose_name='類型',on_delete=models.CASCADE)
    def __unicode__(self):
        return '%s / %s / %s' % (self.add_date.strftime('%Y-%m-%d'),self.type,self.record)
    class Meta:
        verbose_name = '數(shù)據(jù)'
        verbose_name_plural = '數(shù)據(jù)'
class Note(models.Model):
    title = models.CharField(max_length=50,verbose_name='簡述')
    note = models.TextField(verbose_name='備注')
    fordata = models.ForeignKey(DailyData,verbose_name="備注給",on_delete=models.CASCADE)
    def __unicode__(self):
        return self.title

    class Meta:
        verbose_name = '事件記錄'
        verbose_name_plural = '事件記錄'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容