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日

相关文章

  • 以一个投票程序的实例来讲解Python的Django框架使用

    让我来详细讲解一下“以一个投票程序的实例来讲解Python的Django框架使用”的完整攻略。 首先,需要明确的是,Django是一个基于Python的开源web框架,它让开发web应用变得更加容易,同时也能提高开发效率。在本攻略中,我们将借助Django框架来实现一个简单的投票程序,以便更好地理解Django框架的使用方法。 一、环境搭建在使用Django…

    Django 2023年5月16日
    00
  • 用django框架开发一个B2C购物网站用户注册知识点总结2

    一:用户部分: 用户注册: 用户注册序列化器: 1 import re 2 3 from django_redis import get_redis_connection 4 from rest_framework import serializers 5 6 from users.models import User 7 8 9 class CreateU…

    Django 2023年4月16日
    00
  • Django配置Mysql数据库连接的实现

    确保Django项目在本地开发环境中正确地连接到Mysql数据库是至关重要的。下面是连接Django项目到Mysql数据库的完整攻略。 安装mysqlclient包 Mysqlclient是Python和MySQL之间的一个轻量级驱动程序。通过使用它,Django可以连接到Mysql数据库并进行几乎所有的数据库操作。 在安装mysqlclient之前,需要确…

    Django 2023年5月16日
    00
  • Django-ORM框架

    对象关系映射模型是通过面向对象的方式来操作数据库,这就需要对应的关系映射,数据中可以分为库,表,字段信息,一条条数据,而需要用面向对象的关系去对应。于是就有了下面对应关系。 数据库 — 面向对象模型 表 <–> 类 字段 <–> 类属性 记录 <–> 每个实例 Django中的关系映射 使用面向对象的方式描述数据库…

    Django 2023年4月12日
    00
  • django Form 效验

    Django 登入效验 .py from django import forms from student import models from django.core.exceptions import ValidationError from django.core.validators import RegexValidator class RegFo…

    Django 2023年4月10日
    00
  • 详解Django的信号机制

    Django信号是一个事件触发机制。当某些事情发生时,比如模型保存,信号将被触发,并执行注册的处理函数。信号机制可以帮助我们在Django应用程序中实现解耦和扩展性。 本文将详细介绍Django信号机制的完整攻略,包括信号的定义、注册和处理函数等。 定义信号 Django中的信号被定义在signals.py文件中。下面是一个简单的示例: from djang…

    Django 2023年3月13日
    00
  • django-redis 使用规范

    django-redis 基于 BSD 许可, 是一个使 Django 支持 Redis cache/session 后端的全功能组件. 1,安装 django-redis 最简单的方法就是用 pip : pip install django-redis   2,作为 cache backend 使用配置: 为了使用 django-redis , 你应该将你…

    2023年4月10日
    00
  • Django+Vue打造购物网站(八)

    购物车、订单管理和远程调试 添加商品到购物车 trade/serializers.py from rest_framework import serializers from goods.models import Goods from trade.models import ShoppingCart class ShopCartSerializer(ser…

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