利用xadmin制作简单数据管理系统(二)
- 2014-08-08 22:38:00
- CJL 原创
- 9693
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())
发表评论