利用xadmin製作簡單數據管理繫統(二)
- 2014-08-08 22:38:00
- CJL 原創
- 9741
python學習筆記 篇二 (歡迎大傢進行添加修正,需要樣例源碼的請髮送郵件到chujilu1991@163.com索取)
利用xadmin製作簡單數據管理繫統
要點:自定義權限,自定義過濾器,自定義默認值
場景介紹
需要利用xadmin製作一套數據管理繫統
需要三級權限
繫統管理員->所有權限,包括增刪查改
部門管理員->審查權限(僅限數據查看),僅限查看本地區的數據,無編輯權限,賦予下級人員編輯權限
録入員->僅可以查看自己提交的內容,在特定的時間段內允許增刪改,超過特定的時間需曏上級部門申請
(1) 録入員僅限查看自己提交的內容
實現思路:先定義一箇自定義權限(list_by_user),在錶上添加一箇録入人的字段(inputuser),然後在get_list_queryset上添加一箇過濾器,過濾器根據權限不衕進行不衕內容的過濾
實現關鍵代碼:
models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Qhproject(models.Model):
name = models.CharField(u'項目名稱',max_length=50)
progress = models.CharField(u'項目進度',max_length=200,blank=True)
adep = models.CharField(u'委託部門',max_length=50,blank=True)
aname = models.CharField(u'委託人',max_length=50,blank=True)
anum = models.CharField(u'委託人聯繫電話',max_length=50,blank=True)
bname = models.CharField(u'項目經理',max_length=50,blank=True,default="盛偉")
bnum = models.CharField(u'項目經理聯繫電話',max_length=50,blank=True)
bmem = models.CharField(u'項目組成員',max_length=50,blank=True)
startdate = models.DateField(u'項目開始時間',blank=True,null=True)
enddate = models.DateField(u'項目結束時間',blank=True,null=True)
needenddate = models.DateField(u'需求分析結束時間',blank=True,null=True)
teststartdate = models.DateField(u'軟件測試開始時間',blank=True,null=True)
inputuser = models.ForeignKey(User, verbose_name='創建者', blank=True, null=True )
fee = models.CharField(u'項目收費(¥)',max_length=50,blank=True,help_text='單位(元)')
description = models.TextField(u'項目簡介',blank=True)
remark = models.TextField(u'備註',blank=True)
class Meta:
verbose_name = u"項目"
verbose_name_plural = u"項目"
#添加自定義權限
permissions = (
("editpname","edit project manager name"),
)
adminx.py
import xadmin
from xadmin import views
from projectArc.models import Qhproject
#註冊允許xadmin管理的類
class QhprojectAdmin(object):
list_display = ('name','bname','progress','fee','startdate','enddate')
readonly_fields = ('bname','inputuser',)
#查詢過濾
def get_list_queryset(self):
#self.user.id穫取當前登陸用戶的id
#判斷權限,如果是超級管理員不進行過濾
if(not self.user.is_superuser):
return super(QhprojectAdmin, self).get_list_queryset().filter(inputuser=self.user.id)
return super(QhprojectAdmin, self).get_list_queryset()
xadmin.site.register(Qhproject,QhprojectAdmin)
(2)録入人員字段的自動填充
實現思路:裝飾edit類的models_save方法,在保存之前給inputuser賦值,在編輯頁麵將inputuser字段置爲隻讀
實現關鍵代碼:
adminx.py
#其他代碼見第一例,後麵代碼均爲在其基礎上添加或修改.前後均用....代替
....
#隻讀字段
readonly_fields = ('inputuser',)
....
#保存默認值
def save_models(self):
#第一次編輯的時候纔會進行修改
if(self.new_obj.inputuser==""):
self.new_obj.inputuser = self.user
self.new_obj.save()
....
(3)根據權限不衕可編輯字段不衕
實現思路:裝飾get_readonly_fields方法使其根據權限不衕返迴不衕的隻讀字段
實現關鍵代碼:
adminx.py
....
#隻讀字段 默認字段都有編輯權限
readonly_fields = ('inputuser',)
....
#根據權限設置 區分編輯內容
def get_readonly_fields(self):
#穫得原隻讀字段 使用list()方法將tuple轉化爲list
r_f_n = list(super(QhprojectAdmin, self).get_readonly_fields())
#權限標記爲appname.permitionname 如果沒有權限編輯也不是超級管理員則添加隻讀字段
if (not self.request.user.has_perm('projectArc.editpname')) and (not self.request.user.is_superuser):
r_f_n.append('bname')
return r_f_n
....
(4)僅限查看本地區的數據
實現思路:添加一箇根據地區或部門進行的分組,如"部門_開髮部",衕時添加一箇查看衕部門提交內容的權限.對部門管理員進行該權限的賦權,併將本部門員工都加入該分組.
在過濾器處根據權限進行修改過濾器,返迴不衕的內容
實現關鍵代碼:
models.py
....
permissions = (
("editpname","edit project manager name"),
("editpnameallgroup","edit his group's project manager name"),
)
....
adminx.py
....
#判斷權限,如果是超級管理員不進行過濾
if(not self.request.user.is_superuser):
#print self.request.user.has_perm('projectArc.editpnameallgroup'),"權限檢查"
#對是否有查看衕組人員內容權限進行判斷
if(self.request.user.has_perm('projectArc.editpnameallgroup')):
#穫得衕組人員list 組以部門開頭的組名稱爲準
same_group_users = self.request.user.groups.get(name__startswith="部門").user_set.all()
return super(QhprojectAdmin, self).get_list_queryset().filter(inputuser__in=same_group_users)
return super(QhprojectAdmin, self).get_list_queryset().filter(inputuser=self.request.user.id)
return super(QhprojectAdmin, self).get_list_queryset()
....
(5)特定的時間有編輯權限
實現思路:裝飾判斷權限的方法加入根據日期判斷或日期臨時權限,日期根據錶進行存儲
實現關鍵代碼:明天再寫....
(6)雜項
filter
條件選取querySet的時候,filter錶示=,exclude錶示!=。
querySet.distinct() 去重覆
__exact 精確等於 like 'aaa'
__iexact 精確等於 忽略大小寫 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小寫 ilike '%aaa%',但是對於sqlite來説,contains的作用效果等衕於icontains。
__gt 大於
__gte 大於等於
__lt 小於
__lte 小於等於
__in 存在於一箇list範圍內
__startswith 以...開頭
__istartswith 以...開頭 忽略大小寫
__endswith 以...結尾
__iendswith 以...結尾,忽略大小寫
__range 在...範圍內
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
例子:
>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
發錶評論