Django 重写用户模型的实现

下面是 "Django 重写用户模型的实现" 的完整攻略:

1. 为什么要重写用户模型

Django自带的用户模型(User)虽然简单易用,但有时会出现一些局限性,比如你想在用户模型里添加一些自定义字段,这是非常麻烦的。为了解决这种情况,我们可以对Django的用户模型进行重写。

2. 重写用户模型的方法

重写用户模型的方法有两种:继承AbstractBaseUser和继承AbstractUser,下面分别介绍这两种方法。

2.1 继承AbstractBaseUser

继承AbstractBaseUser需要定义以下属性:

  1. username:用户名;
  2. email:电子邮箱地址;
  3. password:密码;
  4. is_active:用户是否处于激活状态;
  5. is_admin:用户是否为管理员。

下面是示例代码:

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class UserManager(BaseUserManager):
    def create_user(self, email, username, password=None):
        user = self.model(
            email=self.normalize_email(email),
            username=username,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password):
        user = self.create_user(
            email=self.normalize_email(email),
            password=password,
            username=username,
        )
        user.is_admin = True
        user.is_active = True
        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=30, unique=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return self.is_admin

这个示例代码中定义了一个UserManager来管理User实例。通过create_user方法创建User实例,并添加到数据库中。create_superuser方法会自动创建一个管理员用户。同时,我们也需要实现has_perm和has_module_perms方法来判断用户是否有权限。

2.2 继承AbstractUser

继承AbstractUser不需要定义任何属性,可以直接添加自定义字段。

下面是示例代码:

from django.contrib.auth.models import AbstractUser, UserManager

class User(AbstractUser):
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
    website = models.URLField(null=True, blank=True)
    bio = models.TextField(max_length=500, null=True, blank=True)

    objects = UserManager()

这里我们直接继承了AbstractUser,并添加了三个自定义字段。这里UserManager直接使用Django自带的UserManager。

3. 配置settings.py

在我们完成了User的重写后,我们需要在settings.py中配置AUTH_USER_MODEL属性。

AUTH_USER_MODEL = 'app_name.User'

这里的app_name就是你创建User模型的应用名。

4. 示例

下面是两个示例说明,分别演示了继承AbstractBaseUser和继承AbstractUser两种实现方式。

4.1 示例1:继承AbstractBaseUser

在这个示例中,我们创建了一个简单的博客网站。用户模型继承于AbstractBaseUser。

  1. 创建django项目,定义应用,并在应用下创建自定义用户模型(models.py):

```python
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser

class MyUserManager(BaseUserManager):
def create_user(self, email, username, password=None):
if not email:
raise ValueError('必须填写电子邮件地址')
if not username:
raise ValueError('必须填写用户名')

       user = self.model(
           email=self.normalize_email(email),
           username=username
       )

       user.set_password(password)
       user.is_active = True
       user.save(using=self._db)
       return user

   def create_superuser(self, email, username, password):
       user = self.create_user(
           email=email,
           username=username,
           password=password
       )
       user.is_active = True
       user.is_staff = True
       user.is_superuser = True
       user.save(using=self._db)
       return user

class MyUser(AbstractBaseUser):
email = models.EmailField(verbose_name='email', max_length=50, unique=True)
username = models.CharField(max_length=20, unique=True, null=False, blank=False)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)

   objects = MyUserManager()
   USERNAME_FIELD = 'email'
   REQUIRED_FIELDS = ['username']

   def __str__(self):
       return self.username

   def has_perm(self, perm, obj=None):
       return True

   def has_module_perms(self, app_label):
       return True

```

  1. 配置settings.py文件(建议使用.env文件、.ini等方式配置以上的信息):

python
...
AUTH_USER_MODEL = 'myuser.MyUser'
...

4.2 示例2:继承AbstractUser

在这个示例中,我们使用了AbstractUser,并在模型中增加了一个avatar属性,用于存储用户头像。

  1. 创建django项目,定义应用,并在应用下创建自定义用户模型(models.py):

    ```python
    from django.contrib.auth.models import AbstractUser
    from django.db import models

    class UserProfile(AbstractUser):
    avatar = models.ImageField(upload_to='avatar', blank=False, null=True, verbose_name='头像')

    class Meta:
        verbose_name = '用户信息'
        verbose_name_plural = verbose_name
    
    def __str__(self):
        return self.username
    

    ```

  2. 配置settings.py文件。

python
...
AUTH_USER_MODEL = 'app.UserProfile'
...

这两个示例说明了对Django重写用户模型的两种方法的应用。继承AbstractBaseUser可以创建可以管理的模型,并增加必要的字段,而继承AbstractUser不需要改变管理模型,只需要在模型中增加自己的属性即可。根据实际需求选择不同的方法即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django 重写用户模型的实现 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • QQ_990814268 摘抄Django项目购物车、订单(三)

    提示 使用redis数据库存储购物车数据 购物车需要完成增、删、改、查的逻辑 查询的结果,需要由服务器响应界面给客户端展示出来 增删改的操作,是客户端发数据给服务器,两者之间的交互是局部刷新的效果,需要用ajax交互 添加购物车的请求方法:post 服务器和客户端传输数据格式:json 服务器接收的数据 用户id:user_id 商品id:sku_id 商品…

    Django 2023年4月13日
    00
  • 【网络开发】WeX5的Ajax和Django服务器json接口对接跨域问题解决

    问题背景 WeX5是典型的html5+js架构。源文件全部放到服务器的UI Server中,使用通用的tomcat,例如使用域名www.wuyoubar.cn:8080/x5。 Android和IOS的服务器端Django已经实现了json的处理,json的主域名www.wuyoubar.cn:80 PC访问WeX5页面。避免重复进行数据处理,WeX5的JS…

    Django 2023年4月13日
    00
  • nginx + uWSGI 提高 Django的并发性

    1. uWSGI : uWSGI是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。 uWSGI的主要特点是: 超快的性能 低内存占用 多app管理 详尽的日志功能(可以用来分析app的性能和瓶颈) 高度可定制(内存大小限制,服务一定次数后重启等) uWSGI服务器自己实现了基于uwsgi协议的server部分,我们只需要在uwsgi的配…

    Django 2023年4月10日
    00
  • 详解Django存在关联关系的反向查询

    Django是一款高效的Web框架,其ORM(对象关系映射)系统使得我们可以通过Python对象来操作数据库,进一步简化了开发流程。 在Django中,关联关系是非常重要的,它使我们可以在不同的模型之间建立联系。在正常的关联查询中,我们常常使用related_name属性来定义关联模型的反向查询名称,但是当我们需要反向查询时,还有一些其他的方法。 本文将深入…

    Django 2023年3月12日
    00
  • Django分页器的用法详解

    Django分页器的用法详解 在网站开发过程中,通常需要对一些数据进行分页展示,而Django提供了方便的分页器来满足开发者的需求。本文将详细介绍Django分页器的用法,并带有两个实例说明。 一、Django分页器基本用法 Django提供了Paginator类来实现分页器。我们首先需要在视图中导入Paginator类: from django.core.…

    Django 2023年5月16日
    00
  • [Django_1_2]数据库设置

    本篇将介绍Django中的数据库设置,了解模型(models,数据库中的表项设计)。上一篇文章为:<a href=”http://www.cnblogs.com/guoyunzhe/p/5778295.html”, target=”_blank”> Django 第一个app 选择数据库类型 Django默认使用的是SQLite,同时还支持MyS…

    Django 2023年4月13日
    00
  • Python Django教程之实现待办事项应用程序

    下面我将详细讲解“Python Django教程之实现待办事项应用程序”的完整攻略,包含两条示例说明。 1. 背景介绍 待办事项应用程序是一个很常见的小应用,它能够帮助我们高效地记录和管理我们的日常任务。因此,它也是Django教程中的一个很好的案例。在这个教程中,我们将使用Django框架和一些简单的HTML、CSS、JavaScript技术实现一个待办事…

    Django 2023年5月16日
    00
  • Django-报错解决方法

    无法使用Django新建项目:’django-admin.py’不是内部或外部命令找到site-packages/django/bin(如 D:\Program Files\Anaconda3\Lib\site-packages\django\bin),把这个路径加入系统环境变量中。 error: unrecognized arguments: getall…

    2023年4月10日
    00
合作推广
合作推广
分享本页
返回顶部