利用xadmin製作簡單數據管理繫統(二)

2014-08-08 22:38:00
CJL
原創
9248
摘要:要點:自定義權限,自定義過濾器,自定義默認值 場景介紹 需要利用xadmin製作一套數據管理繫統 需要三級權限 繫統管理員->所有權限,包括增刪查改 部門管理員->審查權限(僅限數據查看),僅限查看本地區的數據,無編輯權限,賦予下級人員編輯權限 録入員->僅可以查看自己提交的內容,在特定的時間段內允許增刪改,超過特定的時間需曏上級部門申請
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())
發錶評論
評論通過審核後顯示。
流量統計