跳转到主要内容

自定义Django用户模型,使电子邮件成为USERNAME_FIELD。

项目描述

CUser使得使用电子邮件地址作为您的标识令牌而不是用户名变得简单。

CUser是一个自定义的Django用户模型(扩展AbstractBaseUser),因此使用它需要非常少的努力。

CUser与纯Django User 的唯一区别是电子邮件地址是 USERNAME_FIELD(并且用户名不存在)。

CUser支持Django 3.2 - 5.1。如果您需要使用CUser与Django 1.8 - 3.1一起使用,您必须安装一个较旧且未维护的CUser版本,如“安装和设置”部分中所述。

为什么使用CUser?

因为您想要使用 django.contrib.auth 中除 username 字段之外的所有功能,并且希望用户可以使用电子邮件地址进行登录。同时,您不想创建自己的自定义用户模型或认证后端。

安装与设置

重要:为了简化流程,以下步骤将指导您使用CUser的 CUser 模型作为您的Django项目用户模型。然而,强烈建议您设置一个自定义用户模型,该模型扩展CUser的 AbstractCUser 类,即使CUser的 CUser 模型对您来说已经足够(这样,如果需要,您可以自定义用户模型)。如果您不想遵循此建议而只想使用CUser的 CUser 模型,只需按照以下步骤操作(您可以跳过本段落的其余部分)。如果您想遵循此建议,您仍然应该按照以下步骤操作,但需要以下调整:在步骤3之后,遵循 这些说明,但将 from django.contrib.auth.models import AbstractUser 替换为 from cuser.models import AbstractCUser,并将 from django.contrib.auth.admin import UserAdmin 替换为 from cuser.admin import UserAdmin。然后,对于以下步骤的步骤4,您应将 AUTH_USER_MODEL 设置为您自定义的用户模型,而不是CUser的 CUser 模型。然后,您应该运行 python manage.py makemigrations。之后,您可以按照以下剩余步骤的原文进行操作。

  1. 如果您的Django项目之前使用了Django的默认用户模型 django.contrib.auth.models.User,或者您不熟悉使用自定义用户模型,请先转到 注意 部分(然后返回)。否则,继续前进!

  2. 使用 pip 安装

    # Django 3.2 - 5.1
    pip install django-username-email
    
    # Django 3.1 (unmaintained)
    pip install django-username-email==2.4.2
    
    # Django 2.2 or 3.0 (unmaintained)
    pip install django-username-email==2.3.1
    
    # Django 2.0 or 2.1 (unmaintained)
    pip install django-username-email==2.2.4
    
    # Django 1.11 (unmaintained)
    pip install django-username-email==2.1.6
    
    # Django 1.8 - 1.10 (unmaintained)
    pip install django-username-email==2.1.2
  3. cuser 添加到您的 INSTALLED_APPS 设置

    INSTALLED_APPS = [
        ...
        'cuser',
    ]
  4. 使用settings.py中的 AUTH_USER_MODEL 设置指定自定义模型作为您项目的默认用户模型

    AUTH_USER_MODEL = 'cuser.CUser'
  5. 如果您使用Django的默认 AuthenticationForm 类,强烈建议您使用CUser中包含的类替换它。这将使 <input>type 属性设置为 email,并且浏览器的自动完成功能将建议电子邮件地址而不是用户名。例如,如果您的项目正在使用Django的默认 LoginView 视图(或Django < 1.11中的 login 视图),这是您在urls.py中输入的内容,以使用CUser的 AuthenticationForm

    from cuser.forms import AuthenticationForm
    from django.conf.urls import include, url
    from django.contrib.auth.views import LoginView
    
    urlpatterns = [
        url(r'^accounts/login/$', LoginView.as_view(authentication_form=AuthenticationForm), name='login'),
        url(r'^accounts/', include('django.contrib.auth.urls')),
        ...
    ]

    或者,如果您正在使用Django < 1.11

    from cuser.forms import AuthenticationForm
    from django.conf.urls import include, url
    from django.contrib.auth.views import login
    
    urlpatterns = [
        url(r'^accounts/login/$', login, {'authentication_form': AuthenticationForm}, name='login'),
        url(r'^accounts/', include('django.contrib.auth.urls')),
        ...
    ]
  6. 运行迁移。

    python manage.py migrate
  7. 很可能您希望 foo@example.comFOO@example.com 被视为同一个电子邮件地址。处理方法有很多种,具体取决于您项目的需求和个人偏好,因此CUser不提供开箱即用的解决方案。如果您适用,您需要自己解决这个问题。如果您正在使用CUser的 AuthenticationForm 类(见步骤5),您可能想将其子类化并覆盖 error_messages['invalid_login']

配置

要覆盖任何默认设置,在settings.py中创建一个名为 CUSER 的字典,其中包含您想要覆盖的每个设置。例如

CUSER = {
    'app_verbose_name': 'Authentication and Authorization',
    'register_proxy_auth_group_model': True,
}

这些是设置

app_verbose_name(默认:_("自定义 用户")

此设置控制CUser将用于其AppConfigverbose_name的值。

register_proxy_auth_group_model(默认:False

当设置为True时,CUser的admin.py将注销Django的默认Group模型并注册其自己的代理模型,该模型是Django默认Group模型的代理(也命名为Group)。如果您希望Django的默认Group模型在管理界面中与CUser的CUser模型出现在相同的位置,这非常有用。

注意事项

如果您有引用Django User模型的表,您必须删除那些表和迁移,然后重新迁移。这将确保从开始设置就正确无误。

您应使用django.contrib.auth.get_user_model()而不是直接引用User模型。

当您定义与User模型的外键或多对多关系时,您应使用AUTH_USER_MODEL设置指定自定义模型。

例如

from django.conf import settings
from django.db import models

class Profile(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
)

许可证

在MIT许可下发布。有关详细信息,请参阅LICENSE。

原作者

汤姆·梅格尔

有问题、评论或任何其他事项吗?

  • 提交问题

项目详情


下载文件

为您的平台下载文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

django_username_email-2.5.6.tar.gz (13.6 KB 查看散列

上传时间:

构建分布

django_username_email-2.5.6-py3-none-any.whl (13.4 KB 查看散列

上传时间: Python 3

由以下支持