Django自带的Admin十分强大,能快速帮助我们建立一个操作后台。但公司的每个人权限不免需要作区分,并且可能我们需要增加用户字段,这个时候就需要自己对Django的后台做扩展了。
自定义用户模型
扩展用户字段十分简单,首先自己建一个app,在其中定义用户model如下
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
tel = models.CharField('联系电话', max_length=11, blank=True, null=True)
def __str__(self):
return self.username
class Meta(AbstractUser.Meta):
pass
然后在项目的settings.py
里增加AUTH_USER_MODEL = 'APPNAME.User'
以指定user_models到自定义的模型。
最后删除所有migrations目录下的非__init__.py
文件,删库重建。官方文档解释,如果不这样做,可能会导致生成数据库时出现依赖问题。
并且,对应的admins.py
也需要从原有的UserAdmin里继承过来,因为UserAdmin已经定义了许多有用的内容。例如 密码保存时加密
from django.contrib.auth.admin import UserAdmin as _UserAdmin
@admin.register(User)
class UserAdmin(_UserAdmin):
pass
剩下的就跟普通的models一样用了。
只显示特定的条件的数据
譬如销售这个职位,我们只希望他只能看到自己的客户信息,但管理员能看到所有的客户信息。
只需要在对应的admin类里覆盖get_queryset
方法
def get_queryset(self, request):
# 调用父类方法获取全部数据
qs = super().get_queryset(request)
# 判断用户是否为管理员
if request.user.is_superuser:
# 返回全部数据
return qs
# 筛选特定条件的数据
return qs.filter(username=request.user)
控制不可修改的字段
如上自定义了用户字段,但是我现在希望普通用户登陆进来,不能修改自己的部分字段,管理员则能修改所有字段。只需要在admin获取只读字段时拦截重改一下
def get_readonly_fields(self, request, obj=None):
if not request.user.is_superuser:
return ("consultant",)
return self.readonly_fields
即设定只读字段为那些不希望普通用户改的字段名
自动填写字段
譬如销售在自己添加销售单子的时候,我们通过上述的方式控制了他只能不能在修改页修改销售单的销售人员。那么如何让表单显示与提交的时候自动将这个字段填补为提交的用户呢
在对应的admin里复写两个函数即可
def save_model(self, request, obj, form, change):
obj.author = request.user
obj.save()