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日

相关文章

  • Django 表单的Widgets

      每个字段都有一个默认的widget类型。如果想要使用一个不同的Widget,可以在定义字段时使用widget参数。 像这样: from django import forms class CommentForm(forms.Form): name = forms.CharField() url = forms.URLField() comment = f…

    Django 2023年4月11日
    00
  • Django常见错误信息汇总及解决方案

    摘要:最近学习Django中,自己随便写写还是碰到了挺多问题,不过貌似都是比较常见,还能顺利解决。现在写下来,也许以后会忘记,也许能帮上碰到同样问题的 小编我前面已经写过一篇关于Django常见错误的文章了,该文比较适合新手阅读,防止学习Django过程中入坑。今天小编我要总结实际Django开发过程中和debug过程中经常碰到的错误信息以及如何解决它们。本…

    Django 2023年4月15日
    00
  • Django 模型类(models.py)的定义详解

    我们一起来详细讲解下“Django 模型类(models.py)的定义详解”。 什么是Django模型类 Django 模型类是用来在数据库中创建表格的一个抽象,也是Django 框架中的一项非常重要的功能。模型类/数据模型是指定义方法中包含了存储数据的结构,将数据存储在数据库中,可以理解为Django的“数据表”。 通过Django模型类,可以通过定义属性…

    Django 2023年5月16日
    00
  • Django–用户认证组件auth(登录用-依赖session,其他用)

    一、用户认证组件auth介绍 二、auth_user表添加用户信息 三、auth使用示例 四、auth封装的认证装饰器 五、自定义 一、用户认证组件auth介绍 解决的问题: 之前是把is_login=True放在session里来判断用户是否登录之前的操作,在覆盖的时候有问题。例如两个用户先后登录,第一个用户key-value比较多,第二个key-valu…

    Django 2023年4月12日
    00
  • Django创建一个项目:

    安装Django后创建一个项目: 通过命令方式创建项目: 创建一个APP: App是django的组成部分;一个App代表一个模块,所有的URL请求的都是app来处理的。比如一个视频网站,里面有电影模块,电视剧模块,综艺模块,动漫模块;一个Django可以有多个模块,一个模块可以被不同的项目使用。 注意:添加app后需要在项目的setting中设置:(INS…

    2023年4月9日
    00
  • django用户登录和注销的实现方法

    下面我会详细讲解“django用户登录和注销的实现方法”的完整攻略,过程中也会包含两条示例说明。 Django用户登录和注销实现方法 在Django中,用户登录和注销是Web开发中必不可少的功能。Django提供了方便的认证系统,可以帮助我们快速实现这些功能。下面是具体的实现方法。 用户登录 表单设计 首先,我们需要设计一个用户登录表单。一般包含用户名和密码…

    Django 2023年5月16日
    00
  • django使用多个数据库的方法实例

    下面我将为您详细讲解“django使用多个数据库的方法实例”,包含两个示例。 一、Django使用多个数据库的方法 在Django中,如果我们需要使用多个数据库,则可以在settings.py文件中进行设置。首先,默认数据库的设置格式如下: DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.sq…

    Django 2023年5月15日
    00
  • python27+django数据库配置常见问题

    mysql缺乏模块,需要安装,建议去http://sourceforge.net/projects/mysql-python/files/mysql-python/下源码编译,或者安装msi文件http://www.codegood.com/archives/129 UnicodeDecodeError: ‘ascii’ codec can’t decode…

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