AbstractUser和AbstractBaseUser就是对User的不同程度的抽象,AbstractUser是User的完整实现,可用于扩展User,AbstractBaseUser是高度抽象,可用于完全自定义...继承AbstractUser 除了代理模型和OneToOneField,扩展User的新方式是定义新的MyUser并继承AbstractUser,把User替换掉,再添加额外信息。...继承AbstractBaseUser 继承AbstractUser只能做扩展,如果我们想完全自定义用户模型,那么就需要继承AbstractBaseUser,再重写属性和方法。...参考AbstractUser的实现: REQUIRED_FIELDS = ['email'] 这表示email是必填的,在使用createsuperuser命令时,会提示必须输入。...Template和Form不属于前后端分离的技术,在学习时可以选择性跳过。公众号后台回复“加群”,“Python互助讨论群”欢迎你。
一、简介 为了保证软件实现的简洁性,并且与模型保持一致,不管实际情况有多复杂,必须使用建模和设计的最佳实践,即让通过我们的编程技术(设计模型、指责驱动、契约式设计)充分地体现领域模型,并保持模型地健壮性和可扩展性...,而不是单单地实现模型.某些决策设计能和模型紧紧地结合,这种结合要求我们注意每个元素地细节..../// /// 抽象的用户 /// public AbstractUser AbstractUser { get...; set; } } /// /// 抽象的用户,里面定义用户的基本属性 /// public abstract class...//.....省略 Console.WriteLine("当前用户的订单价格为:{0}", priceUser.AbstractUser.OrderPrice
User模型源码分析 class User(AbstractUser): """ Django 身份验证系统中的用户由该模型表示 需要用户名和密码。...AbstractUser类,那么我们查看下AbstractUser的源码 class AbstractUser(AbstractBaseUser, PermissionsMixin): """...USERNAME_FIELD = 'username' # 一个字段名列表,用于当通过createsuperuser管理命令创建一个用户时的提示。...111111") if user: return HttpResponse("登录成功") else: return HttpResponse("登录失败") 扩展用户模型...那么这时候我们就需要扩展用户模型了。扩展用户模型有多种方式。这里我们来一一讨论下。
自定义 User Model 方法1: 扩展 AbstractUser类 如果你对django自带的User model刚到满意, 又希望额外的field的话, 你可以扩展AbstractUser类:...方法3: 使用OneToOneField 如果你想建立一个第三方模块发布在PyPi上, 这一模块需要根据用户储存每个用户的额外信息....当通过createsuperuser管理命令创建一个用户时,用于提示的一个字段名称列表。 class MyUser(AbstractBaseUser): ... ...是必需的 4.扩展Django默认的User 如果你完全满意Django的用户模型和你只是想添加一些额外的属性信息,你只需继承 django.contrib.auth.models.AbstractUser...扩展User时必须重写。 UserChangeForm 依赖于User Model. 扩展User时必须重写。
from django.db import models # 有个坑,扩展字段后密码会明文,当我们提交的时候需要进行设置,在后面的代码中会提到 class User(AbstractUser):...这种方法适合只需要扩展 User Model 中的字段,会继承之前 AbstractUser 的全部字段,系统自带的 User 也是通过继承 AbstractUser 来实现的 # 系统的 User 源码...而官方推荐的则可以不用考虑这个问题 4. 通过元类进行扩展 在网上还找到一种通过元类来扩展字段的方法,这边附上链接 通过元类扩展 User 字段不多讲述。...和 renderer_classes 基本每个 view 都类似,但是涉及到图片上传,一定要添加 FileUploadParser 用户端上传图片后,我们直接保留到项目下。...至于如何设计每个人都不同,我的思路是每个用户的头像都保存到各自以用户名为名的文件夹下,为了防止前一张头像被覆盖,所以用时间戳作为图像名,然后加上客户端回传的后缀名就可以生成我们的图片文件了。
Django内置的User对象,已经包含了一些主要的属性,如username、password、email等,但实际情况可能还需要昵称、头像等其他属性,仅仅使用内置的User属性是不够的。...通过使用AbstractUser可以对User进行扩展使用,添加用户自定义的属性。 User模型源码如下。...,User对AbstractUser仅仅是继承,没有进行任何的扩展。...所以我们继承AbstractUser可以获得User的所有特性。...model中使用 继承AbstractUser from django.contrib.auth.models import AbstractUser class MyUser(AbstractUser
现在大部分web项目基本都会有第三方授权登录,那 django 实现这一需求,应该有很多包可以用,比如 social-auth-app-django,在使用这样的工具时,用户模型要不要做相应的改动?...django 提供用户认证模块 AbstractUser 与 AbstractBaseUser,而 AbstractUser 继承了 AbstractBaseUser,AbstractUser 是一个完整的用户模型...再来看下第一季都有哪些可以回顾和用得上的小技能 本次创建的 django 项目,新建的用户模型继承 AbstractUser ,它是高度集成的类,里面定义的字段,不会完全显示,在迁移数据库时,就会创建。...如果项目只需要基本的用户密码、用户类型等的少数几个字段,这时候用 AbstractUser 会不合理,对数据库资源的浪费,也会降低数据库效率。...REQUIRED_FIELDS 必须设置,通过 createsuperuser 管理命令创建用户时,用于提示字段名称列表 USERNAME_FIELD 必须设置,设置认证标识,标识的字段 unique
Django自定义用户模型 Django带有一个admin功能,这意味着Django默认是有用户管理类的。这点也可以从Django默认生成的表中看到。...然后实现我们自定义的用户模型。...注释掉项目的setting.py文件中INSTALLED_APPS列表中的'django.contrib.admin' 2....同时需要注释掉项目的urls.py中的urlpatterns列表中的path('admin/', admin.site.urls) 3. 执行migrate,发现不会报错了。 4....将前面注释掉的改回来即可。 5. 执行runserver,发现项目可以成功运行 以上就是自定义用户模型可能遇到的问题以及解决方案。
blank=True 的目的是让用户在注册时无需填写昵称。...,就好像每个用户都关联着一张记录个人资料的表一样。...的区别是,继承 AbstractUser 的用户模型只有一张数据库表。...可见,当要查询某个用户的 Profile 时,需要执行额外的跨表查询操作,所以这种方式比起直接继承 AbstractUser 效率更低一点。...因此对于新项目来说,优先推荐使用继承 AbstractUser 的方式来拓展用户模型。
最近在用Django做一个小项目,需要将微信的用户与网站的用户进行关联,由于是微信的订阅号,没有oauth网页授权的权限,只能退而求其次,在响应中获取用户的openid,来唯一的标识用户。...Django中用户的模型继承和扩展于AbstractUser,在用户模型中添加openid字段(models.py): class Users(AbstractUser): openid...= models.CharField(max_length=100,blank=True,null=True,verbose_name="openid",unique=True) 我们扩展了用户的模型...Users.DoesNotExist: return None 2、在配置文件setting.py中指定认证后端: 在底层,Django 维护一个“认证后台”的列表...当调用django.contrib.auth.authenticate() 时,Django 会尝试所有的认证后台进行认证。
Django 继承AbstractUser扩展用户模型 by:授客 QQ:1033553122 测试环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下载地址...User Model,用于记录用户的用户名,密码,邮箱,姓,名等个人信息,这些信息可能无法满足实际需求,这种情况下,需要拓展用户模型,如果项目还没有使用 Django 内置 User 模型,可以采用继承...AbstractUser 的拓展方式进行拓展(如果已经使用了Django的内置模型,Django会为其生成相关数据库迁移文件和数据库表,采用继承方式拓展会比较麻烦。)...,没有对 AbstractUser 做任何的拓展,所以,如果我们可以自己继承 AbstractUser,并根据自己的需求进行拓展。...python manage.py migrate 成功后,Django便会使用我们自定义的用户模型作为默认的用户模型了 注意:一定要在配置好 AUTH_USER_MODEL 变量后再迁移数据库 参考链接
# 前提 继承 django 自带的用户类(AbstractUser) # 环境 1. python: 3.6.x 2. django==1.11.22 # apps/users/models.py...from django.db import models from django.contrib.auth.models import AbstractUser # Create your models...class UserProfile(AbstractUser): """ 用户 """ gender_choice = ( ("1", "男"),..." verbose_name_plural = "用户信息列表" def __str__(self): return "%s-%s %s" % (self.username...# 让用户可以用邮箱登录 # setting 里要有对应的配置 AUTHENTICATION_BACKENDS class CustomBackend(ModelBackend): def
三.扩展默认的auth_user表 一.认证系统 Django自带一个用户认证系统,用于处理用户账户、群组、许可和基于cookie的用户会话。...三.扩展默认的auth_user表 虽然内置的认证系统很好用,但是auth_user表的字段只有固定的几个,实际的应用中需要的字段更多,所以需要对默认的auth_user表进行扩展,第一时间想到的方法是新建另外一张表通过一对一和内置的...auth_user表关联,这样的确可以满足要求,但是其实可以更好,就是通过继承内置的AbstractUser类,来定义一个自己的Model类。...from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): phone = models.CharField...(max_length=255) address = models.CharField(max_length=255) 通过这种方法扩展内置的auth_user表之后,一定要在settings.py
点击上方 毛利学python,选择置顶或星标 第一时间送达Python 技术干货! 5. 自定义过滤器和模板标签 5.1 新建templatetags模块 ?...用户注册 官方文档 django的强大之处在于开发效率高,内置了权限模块之类的很多常用功能。django内置权限系统有大的自定义功能扩展,不需要重复造轮子。...,如email user app下的model from django.contrib.auth.models import AbstractUser,UserManager as _UserManager...通过上面改写UserManager的create_superuser创建超级用户可以不提供email字段 6.2 AbstractUser AbstractUser这是django特定的抽象用户 导入方式...: from django.contrib.auth.models import AbstractUser 创建用户的model,继承了AbstractUser class User(AbstractUser
if user is not None: # 执行验证通过后的代码 else: # 执行验证没有通过的代码。 扩展用户模型: Django内置的User模型虽然已经足够强大了。...那么这时候我们就需要扩展用户模型了。扩展用户模型有多种方式。这里我们来一一讨论下。 1. 设置Proxy模型: 如果你对Django提供的字段,以及验证的方法都比较满意,没有什么需要改的。...继承自AbstractUser: 对于authenticate不满意,并且不想要修改原来User对象上的一些字段,但是想要增加一些字段,那么这时候可以直接继承自django.contrib.auth.models.AbstractUser...示例代码如下: from django.contrib.auth.models import AbstractUser class User(AbstractUser): telephone =...REQUIRED_FIELDS:一个字段名列表,用于当通过createsuperuser管理命令创建一个用户时的提示。 is_active:一个布尔值,用于标识用户当前是否可用。
获取用户列表(验证token)""" class getUser(mixins.ListModelMixin,GenericViewSet): authentication_classes =...createUserViewRouter.register('', views.createUser,) getUserRouter = routers.DefaultRouter() # 查看用户列表...path('getuser/',include(getUserRouter.urls)), # 新增用户 ] 获取TOKEN 创建一个用户(调用新增用户接口) http://127.0.0.1...JSONWebTokenAuthentication,) # 验证token permission_classes = (permissions.IsAuthenticated,) # 只允许登陆成功的用户访问...,) # 登陆成功的token permission_classes = (permissions.IsAuthenticatedOrReadOnly,) # 登陆成功的token,只能读操作 permission_classes
有需要上网现查现学的东西。 分页 分页是指在web页面有大量数据需要显示,为了阅读方便在每个页页中只显示部分数据。 好处: 方便阅读 减少数据提取量,减轻服务器压力。...Paginator对象 负责分页数据整体的管理 对象的构造方法 参数 需要分类数据的对象列表 每页数据个数 返回值: Paginator的对象 Paginator属性...它将被浏览器用于“另存为…”对话框 对于CSV文件中的每一行,调用writer.writerow,传递一个可迭代对象,如列表或元组。...auth扩展字段 如果需要在默认auth表上扩展新的字段,如phone 添加新的应用 定义模型类 继承 AbstractUser settings.py中 指明 AUTH_USER_MODEL = ‘应用名...process=4 # 每个进程的线程个数 threads=2 # 服务的pid记录文件 pidfile=uwsgi.pid # 服务的目志文件位置
当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。...3 扩展默认的auth_user表 这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊! 比如,我想要加一个存储用户手机号的字段,怎么办?...我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。 这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。...from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): """ 用户信息表...max_length=11, null=True, unique=True) def __str__(self): return self.username 注意: 按上面的方式扩展了内置的
背景 页面中有很多的功能,对于不同的权限需要展示不同的页面,不同的权限可以操作的范围也不同,所以需要进行登录操作,并进行权限管理。...Django有自带了一个用户管理模块,所以不再从头编写,而是从它的基础上进行二次开发 用户表 Django自带用户管理模块的models.py文件为: from django.contrib.auth.models...import AbstractUser 简单看一下AbstractUser和它的父类 它里面包含了很多登录的常用字段了 id password last_login is_superuser username...models.CharField('姓名', max_length=, help_text='姓名', error_messages={'max_length': '姓名长度不正确', }) 权限列表..., help_text='权限', null=True) REQUIRED_FIELDS = ['mobile', 'name'] # 在通过 createsuperuser 管理命令创建用户时
使用建造者对于具体的实例进行一层”保护“,这样直接对于对象的生成过程封闭并且保证对象的「线程安全」: public class UserBuilder { /** * 用户id...*/ private final String orgName; public static class Builder { /** * 用户...,这个案例的表现了对于构造器的 「进阶用法」,对于构造器也可以进行动态扩展,这里直接给出代码了,在书中的案例会更为复杂一点,这里进行了简化。...} } 具体的实现产品以及子类化的构建器,可以看到通过这种方式,就可以完全发挥建造者模式的作用了,不仅保证了动态扩展,同时可以保证细节处理和公用的处理进行解耦,但是使用这种设计模式需要一定的编程经验才写得出...,对于建造者的深层扩展需要深厚的编程经验和技巧支持,这是我们需要进步和学习的点,但是写出这样的代码无疑需要大量的代码编写练习。
领取专属 10元无门槛券
手把手带您无忧上云