Django admin定制化,User字段扩展[原创]
前言
参考上篇博文,我们利用了OneToOneField的方式使用了django自带的user,http://www.cnblogs.com/caseast/p/5909248.html , 但这么用有个问题,就是每次增删改查数据,因为有外键的存在都要查询两次(当然可以用select_related方式减少查询次数,参考: Django models对象的select_related方法(减少查询次数) ),另外在admin中需要维护2张表,先创建User,再在UserProfile中进行关联操作。本篇就来介绍一下,如何定制User和admin达到以下目的:1.扩展django自带的User,且不通过OneToOne的方式。2.修改User中的字段,让诸如email这种字段变为必选项(默认为可选)。3.admin表单定制,让不同权限的用户显示不同的页面。
期间踩了很多坑,统一做一次整理,admin可定制的地方很多,但是定制的方法肯定不如自己写的后台那么灵活,需要大体了解django的User和admin的工作模式和源码,怎么取舍还看自己的需求了。
代码实现
扩展User的方法大概有4种,参考这个国外博客:https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#proxy ,我用的是里边描述的第四种方法。
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser, Group
# Create your models here.
''' OneToOne的扩展写法,原来的写法
class UserProfile(models.Model):
user = models.OneToOneField(User)
name = models.CharField(u'姓名', max_length=32, blank=False, null=False)
class Meta:
verbose_name = u'用户详情'
verbose_name_plural = u"用户详情"
'''
class MyUser(AbstractUser): # 继承AbstractUser类,实际上django的User也是继承他,我们要做的就是用自己的类代替django自己的User
name = models.CharField(u'中文名', max_length=32, blank=False, null=False)
class Meta:
verbose_name = u'用户详情'
verbose_name_plural = u"用户详情"
这里附上Django User类部分源码
class User(AbstractUser):
"""
Users within the Django authentication system are represented by this model.
Username, password and email are required. Other fields are optional.
"""
class Meta(AbstractUser.Meta):
swappable = 'AUTH_USER_MODEL'
光做以上这些还不够,我们需要告诉django,我们不用你的User了,要用自己的,所以需要在settings.py里重新设定一个变量
settings.py
AUTH_USER_MODEL = "web_sso.MyUser" # 我们的app叫web_sso,这个MyUser就是models定义的那个类
看下扩展完的效果,可以看到,我们不用再像之前一样维护“用户”和“用户详情”两张表了,但还是有很多小问题需要解决。
长话短说,直接看一下,我的admin.py改了哪些东西吧.
admin.py
from django.contrib import admin
from web_sso import models
from django.contrib.auth.admin import UserAdmin # 从django继承过来后进行定制
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.forms import UserCreationForm, UserChangeForm # admin中涉及到的两个表单
class User_exAdmin(admin.ModelAdmin): # 验证码部分展示
list_display = ('valid_code', 'valid_time', 'email')
# custom user admin
class MyUserCreationForm(UserCreationForm): # 增加用户表单重新定义,继承自UserCreationForm
def __init__(self, *args, **kwargs):
super(MyUserCreationForm, self).__init__(*args, **kwargs)
self.fields['email'].required = True # 为了让此字段在admin中为必选项,自定义一个form
self.fields['name'].required = True # 其实这个name字段可以不用设定required,因为在models中的MyUser类中已经设定了blank=False,但email字段在系统自带User的models中已经设定为
# email = models.EmailField(_('email address'), blank=True),除非直接改源码的django(不建议这么做),不然还是自定义一个表单做一下继承吧。
class MyUserChangeForm(UserChangeForm): # 编辑用户表单重新定义,继承自UserChangeForm
def __init__(self, *args, **kwargs):
super(MyUserChangeForm, self).__init__(*args, **kwargs)
self.fields['email'].required = True
self.fields['name'].required = True
class CustomUserAdmin(UserAdmin):
def __init__(self, *args, **kwargs):
super(CustomUserAdmin, self).__init__(*args, **kwargs)
self.list_display = ('username', 'name', 'email', 'is_active', 'is_staff', 'is_superuser')
self.search_fields = ('username', 'email', 'name')
self.form = MyUserChangeForm # 编辑用户表单,使用自定义的表单
self.add_form = MyUserCreationForm # 添加用户表单,使用自定义的表单
# 以上的属性都可以在django源码的UserAdmin类中找到,我们做以覆盖
def changelist_view(self, request, extra_context=None): # 这个方法在源码的admin/options.py文件的ModelAdmin这个类中定义,我们要重新定义它,以达到不同权限的用户,返回的表单内容不同
if not request.user.is_superuser: # 非super用户不能设定编辑是否为super用户
self.fieldsets = ((None, {'fields': ('username', 'password',)}),
(_('Personal info'), {'fields': ('name', 'email')}), # _ 将('')里的内容国际化,这样可以让admin里的文字自动随着LANGUAGE_CODE切换中英文
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'groups')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
) # 这里('Permissions')中没有'is_superuser',此字段定义UserChangeForm表单中的具体显示内容,并可以分类显示
self.add_fieldsets = ((None, {'classes': ('wide',),
'fields': ('username', 'name', 'password1', 'password2', 'email', 'is_active',
'is_staff', 'groups'),
}),
) #此字段定义UserCreationForm表单中的具体显示内容
else: # super账户可以做任何事
self.fieldsets = ((None, {'fields': ('username', 'password',)}),
(_('Personal info'), {'fields': ('name', 'email')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
self.add_fieldsets = ((None, {'classes': ('wide',),
'fields': ('username', 'name', 'password1', 'password2', 'email', 'is_active',
'is_staff', 'is_superuser', 'groups'),
}),
)
return super(CustomUserAdmin, self).changelist_view(request, extra_context)
admin.site.register(models.MyUser, CustomUserAdmin) # 注册一下
admin.site.register(models.User_ex, User_exAdmin)
效果展示
首页面
设定组权限管理
编辑用户页面
管理员:
非管理员:(没有设定超级用户的权限)
新增用户页面
通过以上,基本可以实现一个用户管理后台的需求了。
参考资料
https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#proxy
http://www.cnblogs.com/daliangtou/p/5435385.html
https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#django.contrib.auth.models.PermissionsMixin.has_perms
Django admin定制化,User字段扩展[原创]的更多相关文章
- Django admin 组件 原理分析与扩展使用 之 sites.py (一)
一 . 前言 Django 提供了admin 组件 为项目提供基本的管理后台功能(对数据表的增删改查). 本篇文章通过 admin源码 简单分析admin 内部原理 ,扩展使用方式,为以后进行定制和自 ...
- Django Admin定制
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...
- django admin显示多对多字段
参考文档https://jingyan.baidu.com/article/4e5b3e190f55c591901e24b3.html admin.py from .models import *cl ...
- django admin显示多对多字段ManyToManyField
参考文档https://jingyan.baidu.com/article/4e5b3e190f55c591901e24b3.html admin.py from .models import *cl ...
- Django admin美化插件suit应用[原创]
前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...
- 利用 Django admin 完成更多任务(转)
利用 Django admin 完成更多任务 Django admin Django 为未来的开发人员提供了许多功能:一个成熟的标准库,一个活跃的用户社区,以及 Python 语言的所有好处.虽然 ...
- 你应该使用 Django admin 的 9 个理由(转)
你应该使用 Django admin 的 9 个理由 “问题是,我问到的每个人都持反对意见,他们认为 admin 只限于超级用户,很不灵活并且是难以定制.”—来自 Reddit 的 andybak 我 ...
- Django admin 的 9 个技巧
Tip 1:Django admin 后台不限于用 Django 开发的网站 虽然 Django admin 管理界面可以非常友好的用在 Django 项目的其它部分,它同样可以很容易用于其它像传统的 ...
- Django 2.0 学习(10):Django 定制化
定制化admin表单 通过使用admin.site.register(Question)注册Question模型,Django可以构造默认的表单.通常,可以通过对象的注册机制来告诉Django我们想要 ...
随机推荐
- 使用redis构建可靠分布式锁
关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...
- 2015 西雅图微软总部MVP峰会记录
2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...
- 应用工具 .NET Portability Analyzer 分析迁移dotnet core
大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...
- Dapper where Id in的解决方案
简单记一下,一会出去有点事情~ 我们一般写sql都是==>update NoteInfo set NDataStatus=@NDataStatus where NId in (@NIds) Da ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-补充WebApi与Unity注入-配置文件
系列目录 上一篇演示了WebApi利用Unity注入 很多人问我如何用配置文件来配置注入,本节演示如何利用配置文件来注入,道理是一样的,跳转到上一节下载源码一起来动手! 1.打开源码定位到文件Depe ...
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
- 从零开始编写自己的C#框架(26)——小结
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
- Velocity初探小结--velocity使用语法详解
做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...
- Asp.Net Core + Dapper + Repository 模式 + TDD 学习笔记
0x00 前言 之前一直使用的是 EF ,做了一个简单的小项目后发现 EF 的表现并不是很好,就比如联表查询,因为现在的 EF Core 也没有啥好用的分析工具,所以也不知道该怎么写 Linq 生成出 ...
- Java类访问权限修饰符
一.概要 通过了解Java4种修饰符访问权限,能够进一步完善程序类,合理规划权限的范围,这样才能减少漏洞.提高安全性.具备表达力便于使用. 二.权限表 修饰符 同一个类 同一个包 不同包的子类 不同包 ...