Django xadmin 实现数据权限控制与用户信息自动填充
本文介绍如何在 Django 的 xadmin 后台中实现数据隔离与用户信息自动记录。通过重写 save_models 方法,在保存数据时将当前登录用户写入 Model 字段;同时利用 queryset 方法过滤列表,确保非超级用户只能查看自己创建的数据。
xadmin 数据权限控制概述
一、实现 xadmin 登录者仅查看自身创建数据的方案
Model 模型定义
1、Model 模型定义
class UserTB(models.Model):
name=models.CharField('姓名',max_length=30,blank=True,null=True)
email=models.CharField('邮箱',max_length=200,blank=True,null=True)
integral = models.IntegerField('积分', default=0)
create_time=models.DateTimeField('创建时间',auto_now_add=True)
user = models.OneToOneField(User,blank=True,null=True) #
def __unicode__(self):
return self.name
class Meta:
verbose_name='员工管理'
verbose_name_plural='员工管理'
class UnitPage(models.Model):
title=models.Charfield('标题',max_length=50)
uploader=models.ForeignKey(UserTB,verbose_name='创建者',related_name='deuser',blank=True,null=True,on_delete=models.SET_NULL)
create_time=models.DateTimeField('创建时间',auto_now_add=True)
def __unicode__(self):
return self.title
class Meta:
verbose_name='文章管理'
verbose_name_plural='文章管理'
adminx 配置类实现
2、adminx 配置类实现
class ProdeUnitDisplay(object):
list_display=['title','create_time'] #需要显示字段
search_fields=['title',] #可搜索的字段
def queryset(self):
if not self.request.user.is_superuser: #判断是否是超级用户
st = UserTB.objects.get(user=self.request.user) #找到用户表里对应的用户
print 'st:',st
sr = self.model.objects.filter(uploader=st) #找到该model 里该用户创建的数据
return sr
return self.model.objects.all()
xadmin.site.register(UnitPage,ProdeUnitDisplay)
获取登录用户信息并填充字段
补充知识:Django2 集成 xadmin 详解 - 5、获取登录用户信息并填充相应 Model 字段
场景问题
一、场景问题
增加用户记录字段
继续使用 IDC Model,在此 Model 增加 user 字段,用于记录添加当前数据的用户:
class IDC(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, editable=False, null=True) # 记录创建该数据的用户
name = models.CharField(max_length=64)
contact = models.CharField(max_length=32)
phone = models.CharField(max_length=32)
address = models.CharField(max_length=128)
create_time = models.DateField(auto_now=True)
def __str__(self):
return self.name
class Meta:
verbose_name = "IDC机房"
verbose_name_plural = verbose_name
保存时获取当前用户
问题:如何在增加 IDC 数据的时候,获取当前登录的用户信息,并保存到 user 字段里?
解决方法
二、解决方法
重写 save_models 方法
打开 IdcManager 目录的 adminx.py,在 IDCAdmin 类里增加 save_models 方法,代码如下:
@xadmin.sites.register(IDC)
class IDCAdmin(object):
list_display = ("user", "name", "contact", "phone", "address", "create_time")
list_display_links = ("name",)
def save_models(self):
self.new_obj.user = self.request.user
super().save_models()
总结与代码排查思路
三、总结
xadmin 的文档和资料比较少,这个问题虽然也就三行代码的事情,但是我在百度是没找到解决方案的。
最终是查看 xadmin 的代码摸索解决的。
那么,应该查看哪部分代码?考虑到这个操作是在保存数据的时候触发的,那么就找 xadmin 处理保存操作(编辑界面)的代码:
venv\Lib\site-packages\xadmin\views\edit.py
以上这篇 Django --Xadmin 判断登录者身份实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









