欢迎访问宙启技术站
智能推送

Django中modelsUser()的扩展和自定义

发布时间:2024-01-13 18:51:02

Django中的User模型是Django默认提供的认证系统的一部分,用于管理用户的认证和权限。但是,有时候我们需要对User模型进行扩展或者自定义,以满足项目的需求。下面将介绍如何对User模型进行扩展和自定义,并给出相应的使用例子。

一、扩展User模型

1. 使用OneToOneField扩展User模型

可以通过使用OneToOneField在User模型之外创建一个新的模型来扩展User模型,然后将这个新模型和User模型通过OneToOneField进行关联。

from django.contrib.auth.models import User
from django.db import models

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # 添加额外的字段
    phone = models.CharField(max_length=20)
    address = models.CharField(max_length=100)

在这个例子中,通过创建了一个UserProfile模型,通过OneToOneField将UserProfile和User进行了关联。然后在UserProfile中可以添加额外的字段,比如phone和address。

2. 使用AbstractUser扩展User模型

Django还提供了一个AbstractUser模型,可以通过继承AbstractUser来扩展User模型。

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

class User(AbstractUser):
    # 添加额外的字段
    phone = models.CharField(max_length=20)
    address = models.CharField(max_length=100)

在这个例子中,通过创建一个User模型并继承AbstractUser,然后可以添加额外的字段,比如phone和address。

二、自定义User模型

有时候我们需要完全自定义User模型,而不是在User模型的基础上进行扩展。这种情况下,要重新定义一个新的User模型。

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

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **kwargs):
        if not email:
            raise ValueError('Email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **kwargs)
        user.set_password(password)
        user.save()
        return user

class User(AbstractBaseUser):
    email = models.EmailField(unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'

    def __str__(self):
        return self.email

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

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

在这个例子中,我们定义了一个UserManager来管理User模型的创建,然后创建一个User模型,并继承了AbstractBaseUser。在User模型中,定义了email字段作为 标识符,并添加了is_active和is_staff两个布尔字段用于进行用户的激活和权限控制。通过定义USERNAME_FIELD为email,指定了email字段作为用户名,以及通过重写has_perm和has_module_perms方法来控制用户的权限。

这种自定义User模型需要在配置文件中设置AUTH_USER_MODEL为自定义的User模型。

使用例子:

from django.contrib.auth import get_user_model

# 创建用户
User = get_user_model()
user = User.objects.create_user(email='test@example.com', password='password')

# 登录验证
User = get_user_model()
user = User.objects.get(email='test@example.com')
user.check_password('password')  # 返回True

# 用户权限验证
user.is_staff  # 返回False

以上就是Django中对User模型进行扩展和自定义的方法及使用例子。根据实际需求,可以选择扩展User模型还是完全自定义一个新的User模型,以满足项目的需求。