首页 > 解决方案 > 通过 dj_rest_auth 在用户注册中保存额外的字段

问题描述

我一直在这个项目的 dj_rest_auth 上。尝试向自定义用户模型添加额外字段,但它只保存电子邮件和密码。我认为我一切正常,但没有任何效果。

这是我的用户模型

class CustomUserManager(BaseUserManager):
    """
    Custom user model manager where email is the unique identifiers
    for authentication instead of usernames.
    """

    def create_user(self, email, password, **extra_fields):
        """
        Create and save a User with the given email and password.
        """
        if not email:
            raise ValueError('The Email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', 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 CustomUser(AbstractUser):
    username = None
    email = models.EmailField('email address', unique=True)

    USERNAME_FIELD = 'email'
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    phone = models.CharField(max_length=30, blank=True)

    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.email

序列化程序.py

class UserSerializer(serializers.ModelSerializer):
    phone = serializers.CharField(max_length=30, allow_blank=True)
    first_name = serializers.CharField(max_length=30, allow_blank=True)
    last_name = serializers.CharField(max_length=30, allow_blank=True)

    class Meta:
        model = CustomUser
        fields = ('id', 'email', 'first_name', 'last_name', 'phone')
    def save(self, request):
        user = super().save(request)
        user.phone = self.data.get('phone')
        user.first_name = self.data.get('first_name')
        user.last_name = self.data.get('last_name')
        user.save()
        return user

设置.py

AUTH_USER_MODEL = 'users.CustomUser'

REST_AUTH_REGISTER_SERIALIZERS = {
    'REGISTER_SERIALIZER': 'users.serializers.UserSerializer',
}

ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True

ACCOUNT_EMAIL_VERIFICATION = 'mandatory'

最后在我的 urls.py

path('register/', RegisterView.as_view()),

从邮递员我发送这个帖子请求

{
    "email": "ahsan44411@gmail.com",
    "password": "ahsan44411",
    "password2": "ahsan44411",
    "first_name": "ahsan",
    "last_name": "mukhtar",
    "phone": "64763868"
}

它只保存电子邮件地址,电话、名字、姓氏不保存。我已经搜索阅读了stackoverflow上的几乎所有问题,没有任何运气,现在我在这里发布,如果问题不清楚,请通知我。

标签: pythondjangodjango-rest-frameworkdjango-allauth

解决方案


您可以使用该create功能来保存这样的用户数据。希望这个答案能帮助您解决问题。

    def create(self, data):
        u = User(username=data["username"], email=data["email"],phone=data["phone"], first_name=data["first_name"],last_name=data["first_name"])
        u.set_password(data["password"])
        u.save()
        return u

推荐阅读