zoukankan      html  css  js  c++  java
  • Django 创建自定义User模型 CustomUser

    官方文档里给了两种方法

    1.创建一个Model,然后用一对一外键指到User,这样就相当于是扩展了User,简单又实用。

    但是这样没法自定义User的save和delete函数(当然你直接去改django源码也是可以的,我之前就是这么干的,但是改源码这种事情实在是不靠谱),所以我就用了另一种方法

    2.直接新建一个CustomUser并‘覆盖’原来的User类

    注意到django源码里User类的定义里有且只有一个swappable='AUTH_USER_MODEL'。我的理解是,这个设置可以指定另一个类,让另一个类来代替这个类。

    首先在model.py里创建一个新的类CustomUser,然后去setting里添加如下字段:

    #我的app名为blog
    AUTH_USER_MODEL = 'blog.CustomUser'

    这样一来,django把所有对User的操作都转移到了我们自己定义的CustomUser类上。

    然后在blog的model.py里的代码如下:

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    import os
    
    
    class CustomUser(AbstractUser):
        location = models.CharField(max_length=100, blank=True, null=True)
        description = models.CharField(max_length=300, blank=True, null=True)
        avatar = models.ImageField(upload_to='avatars/', default='default/default.jpg', max_length=100)
    
        def __str__(self):
            return self.username
    
        def delete(self, *args, **kwargs):
            path = self.avatar.path
            if path:
                os.remove(path)
            super(CustomUser, self).delete(*args, **kwargs)

    我扩展了三个字段:地址、个人简介和头像。

    并且能够随意自定义save和delete函数。

    注:不要轻易覆盖save函数,因为django对User的save的调用实在是太频繁了,就算是登录,也会调用一次save()(django的save和update都使用save())以修改用户的last_login,还有添加组或者修改权限的时候。你在save函数里的代码会被多次调用。

    这样一来,我们创建了自己的CustomUser,并且是完全代替了原来的User类(而不是创建了两个用于管理用户的Model)

  • 相关阅读:
    [转]Asp.Net页面输出到WORD、EXCEL、TXT、HTM等类型的文档
    人工智能AI基础 四
    关于设计的一点小结 四
    Visual Studio 11 将强化对2D/3D游戏开发的支持 四
    如何正确的对待设计模式 四
    C++设计模式原型模式 四
    C++游戏编程8步云 四
    Qt编译 四
    软件架构师应该知道的97件事 四
    给年轻程序员的几句话 四
  • 原文地址:https://www.cnblogs.com/ShiveryMoon/p/8279986.html
Copyright © 2011-2022 走看看