【问题标题】:How to eliminate username from authentication如何从身份验证中消除用户名
【发布时间】:2015-04-21 01:37:12
【问题描述】:

我想从我的应用程序中的 django 身份验证中消除用户名的概念。我希望用户的email 代替username。所以我用下面的代码扩展了AbstractBaseUser

class AuthUserManager(BaseUserManager):
    def create_user(self, email, password=None):
        if not email:
            raise ValueError("Users must have an email address")

        user = self.model(email=self.normalize_email(email),)
        user.is_active = True
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password):
        user = self.create_user(email=email, password=password)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class AuthUser(AbstractBaseUser, PermissionsMixin):
    alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', message = "Only alphanumeric characters are allowed")


    email = models.EmailField(verbose_name='email address',unique=True, max_length=255)
    first_name = models.CharField(unique=True, max_length=20, validators=[alphanumeric])
    last_name = models.CharField(unique=True, max_length=20, validators=[alphanumeric])
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True, null=False)
    is_staff = models.BooleanField(default=False, null=False)

    #custom fields
    company_name = models.CharField(max_length=100)
    telephone_number = models.CharField(max_length=100)
    website_url = models.CharField(max_length=100)

    objects = AuthUserManager()
    USERNAME_FIELD = 'email'
    #REQUIRED_FIELDS = ['first_name']

    def get_full_name(self):
        fullname = self.first_name + self.last_name
        return fullname

    def get_short_name(self):
        return self.email

    def __unicode__(self):
        return self.email

在我的 serializers.py 我有这个

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthUser
        fields = ('email', 'first_name', 'last_name')

    def create(self, validated_data):
        user = AuthUser.objects.create(**validated_data)
        return user

    def update(self, instance, validated_data):
        instance.email = validated_data.get('email', instance.email)
        instance.first_name = validated_data.get('first_name', instance.first_name)
        instance.last_name = validated_data.get('last_name', instance.last_name)
        instance.save()
        return instance

但是当我尝试注册时,我收到以下错误:

{
    "username": [
        "This field is required."
    ]
}

我做错了什么?

【问题讨论】:

  • 这种错误信息会来自表单。您是否使用仍然依赖于username 的注册表单?
  • 我正在使用我的应用程序的 REST API 端点 127.0.0.1:8080/rest-auth/registration 创建新用户。

标签: python django django-models django-authentication


【解决方案1】:

在您的序列化程序中,您需要排除username 字段,因为您是从AbstractBaseUser 继承的,并且您仍然有“用户名”字段,所以添加这个exclude = ('username',)

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthUser
        fields = ('email', 'first_name', 'last_name')
        exclude = ('username',)

    def create(self, validated_data):
        user = AuthUser.objects.create(**validated_data)
        return user

【讨论】:

  • username 字段不在AuthUser
  • @coldmind 他从 AbstractBaseUser 继承它。
猜你喜欢
  • 2021-02-28
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多