当前位置: 首页 > 编程笔记 >

Django 使用`email`作为用户名并摆脱`username`字段

慕金林
2023-03-14
本文向大家介绍Django 使用`email`作为用户名并摆脱`username`字段,包括了Django 使用`email`作为用户名并摆脱`username`字段的使用技巧和注意事项,需要的朋友参考一下

示例

如果您想摆脱该username字段并email用作唯一的用户标识符,则必须创建一个User扩展自定义模型,AbstractBaseUser而不是AbstractUser。确实,username并且email是在中定义的AbstractUser,您不能覆盖它们。这意味着您还必须重新定义要在中定义的所有字段AbstractUser。

from django.contrib.auth.models import (
    AbstractBaseUser, PermissionsMixin, BaseUserManager,
)
fromdjango.dbimport models
fromdjango.utilsimport timezone
from django.utils.translation import ugettext_lazy as _

class UserManager(BaseUserManager):

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

    return self._create_user(email, password, **extra_fields)


class User(AbstractBaseUser, PermissionsMixin):
    """PermissionsMixin contains the following fields:
        - `is_superuser`
        - `groups`
        - `user_permissions`
     You can omit this mix-in if you don't want to use permissions or
     if you want to implement your own permissions logic.
     """

    class Meta:
        verbose_name = _("user")
        verbose_name_plural = _("users")
        db_table = 'auth_user'
        # `db_table` is only needed if you move from the existing default
        # User model to a custom one. This enables to keep the existing data.

    USERNAME_FIELD = 'email'
    """使用电子邮件作为唯一的用户名。"""

    REQUIRED_FIELDS = ['first_name', 'last_name']

    GENDER_MALE = 'M'
    GENDER_FEMALE = 'F'
    GENDER_CHOICES = [
        (GENDER_MALE, _("Male")),
        (GENDER_FEMALE, _("Female")),
    ]

    email = models.EmailField(
        verbose_name=_("email address"), unique=True,
        error_messages={
            'unique': _(
                "A user is already registered with this email address"),
        },
    )
    gender = models.CharField(
        max_length=1, blank=True, choices=GENDER_CHOICES,
        verbose_name=_("gender"),
    )
    first_name = models.CharField(
        max_length=30, verbose_name=_("first name"),
    )
    last_name = models.CharField(
        max_length=30, verbose_name=_("last name"),
    )
    is_staff = models.BooleanField(
        verbose_name=_("staff status"),
        default=False,
        help_text=_(
            "指定用户是否可以登录此管理站点。"
        ),
    )
    is_active = models.BooleanField(
        verbose_name=_("active"),
        default=True,
        help_text=_(
            "指定是否应将此用户视为活动用户。 "
            "取消选择它而不是删除帐户。"
        ),
    )
    date_joined = models.DateTimeField(
        verbose_name=_("date joined"), default=timezone.now,
    )

    objects = UserManager()
           

 类似资料:
  • StackTrace: 追踪(最近的调用是最后一次):文件“manage.py”,第22行,在execute_from_command_line(sys.argv)文件“/home/dean/.local/lib/python3.5/site-packages/django/core/management/init.py”中,第363行,在execute_from_command_line uti

  • 如上所述,我的XSL中只定义了一个命名空间,如下所示 xml: xsi="w3.org/2001/XMLSchema-instance" 但是,我的输出XML有2个命名空间,如下所示 xsi="w3.org/2001/XMLSchema-instance"xmlns: mea="ibm.com/maximo" 我可以摆脱xmlns: mea="ibm.com/maximo"

  • 我有JavaWebService代码在我的eclipse。我使用了@WebService@Webmethod,@XmlElements,@XmlType,@XmlAccessorType 现在我正在使用cxf框架中的java2ws命令生成wsdl。这是命令 我的wsdl文件包含agr0作为我不想要的名称,因为当我将其导入SoapUI时。它正在字段周围添加标记。 下面是带有arg0的wsdl部分 下

  • 问题内容: 分类法是一门基于共有特征来定义和命名生物有机体的科学。将有机体分类为分类群(单数:分类群),并且将这些分类分类。现代使用的主要等级是域,王国,门,阶级,秩序,家庭,属和物种。Wikipedia中有关分类学和分类学等级的更多信息。 在 Wikipedia 中的 分类分类中* 的 红狐狸 示例之后,我需要创建一个JSON输出,如下所示: * __ 由于Django的REST框架创建一个基于

  • 问题内容: 我正在使用Apache Derby嵌入式数据库在Maven项目中进行单元测试。不幸的是,每当运行测试时,我最终都会在项目根目录中找到该文件。数据库本身是在目录()中创建的,因此这不是问题。在查阅参考指南之后, 我尝试在JDBC url()上设置参数,但这似乎是针对其他日志的,因此仍然会出现。 任何帮助深表感谢。 问题答案: 您可以通过创建以下类来摆脱文件 并设置JVM系统属性,例如,使

  • 在这段代码中,我从\u RETURN\u VALUE得到了\u SOME\u PATH\u上的