很多人說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)多用戶叶雹,后面的部分有空再去寫。
- 先設(shè)置一般用戶的group换吧,配置好權(quán)限折晦,所有新建用戶都是用一般的權(quán)限。權(quán)限設(shè)置看文檔
- 隔離列表頁
列表頁隔離沾瓦,使用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')
- 隔離增加和修改數(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默認值魂莫,也別忘了列表頁的篩選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 = '事件記錄'