Django - 为什么我应该扩展 User 而不是创建我的一个用户类

问题描述 投票:0回答:3

全部,

我很难理解在 Django 中扩展用户类的优点是什么?我觉得覆盖它并创建我自己的用户类以及我想要的所有文件更有利。

我问这个是因为我看到的所有教程总是提到创建一个配置文件类并从那里扩展用户类。

如果我想多次扩展用户类,我会看到优势,但我觉得这永远不会发生。

django django-users
3个回答
1
投票

您需要扩展 AbstractUser 类,因为您需要使用 django 已经提供的功能。这包括身份验证、组、权限等。

您不会想从头开始编写所有内容。即使您由于应用程序的独特需求而打算自己编写所有内容,仍然建议扩展 AbstractUser 类。也许您将来需要使用它的一些功能。

与您的情况相反,如果有人只需要 Django 已经提供的 User 模型的功能,那么仍然建议创建扩展 AbstractUser 类的新模型。这是因为,一旦您在 settings.py 中设置了

AUTH_USER_MODEL
,您就无法在将来更改它(或者将非常困难)。这样做,将始终让您自由地使用 django 提供的所有功能并实现您可能需要实现的功能。

因此,理想的做法是始终在任何项目开始时(在任何迁移之前)执行此操作:

用户.py

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    
    phone = models.CharField(max_length=25, blank=True,unique=True, null=True)

    def __str__(self):
        return self.username

在你的

settings.py

AUTH_USER_MODEL = 'users.User' 


0
投票

这是 Django 的 AbstractUser 类的源代码,您可以从中扩展自定义用户模型。它在前几行说了这一点:

实现功能齐全的用户模型的抽象基类 符合管理员权限。

如果不包含 Django 的默认类,可能会出现错误。就拿上面的例子来说,如果你没有添加权限,你可能无法访问Django的管理站点。

is_active
is_staff
等字段为您以后自定义身份验证提供了更大的灵活性。

深入挖掘,还有其他配置:

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

除非您绝对确信可以将所有这些都包含在您的模型中,否则我只会建议您利用已经给出的内容。


0
投票

模型.py

from django.contrib.auth.models import AbstractUser
    from django.core.mail import EmailMessage
    from django.db import models
    from django.utils.translation import gettext_lazy as _
    
    
    class User(AbstractUser):
    username = models.EmailField(_('email'), max_length=255, unique=True)
    is_verified = models.BooleanField(default=False)
    is_banned = models.BooleanField(default=False)
    email = models.CharField(max_length=100, default=None)

    REQUIRED_FIELDS = []
    USERNAME_FIELD = "username"
    EMAIL_FIELD = "username"
    
    class Meta:
        verbose_name = _("user")
        verbose_name_plural = _("users")
    
    def email_user(self, subject, message, from_email=None, **kwargs) -> int:
        """ Email this user."""
        msg = EmailMessage(subject, message, from_email, [self.username], **kwargs)
    return msg.send()
    
    def __str__(self):
        return self.username

设置.py

AUTH_USER_MODEL = 'users.User'

管理员.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy
from users.models import User


class UsersAdmin(UserAdmin):
    list_display = ("username",)
    fieldsets = (
        (gettext_lazy('Authentication'), {"fields": ("username", "password")}),
        (gettext_lazy("Personal info"), {"fields": ("first_name", "last_name")}),
        (
            gettext_lazy("Permissions"),
            {
                "fields": (
                    "is_active",
                    "is_staff",
                    "is_superuser",
                    "groups",
                    "user_permissions",
                ),
            },
        ),
        (gettext_lazy("Verifications"), {"fields": ("is_verified", "is_banned")}),
        (gettext_lazy("Important dates"), {"fields": ("last_login", "date_joined")}),
    )


admin.site.register(User, UsersAdmin)
user = User.objects.filter(username='[email protected]').first()
user = User.objects.create_user(username='[email protected]', password='password')

github 扩展Django用户模型的正确方法

© www.soinside.com 2019 - 2024. All rights reserved.