微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 Django Rest Auth 的自定义注册表单 - 错误:save() 需要 1 个位置参数,但给出了 2 个

如何解决带有 Django Rest Auth 的自定义注册表单 - 错误:save() 需要 1 个位置参数,但给出了 2 个

我想使用 Django Rest Auth 和 Django Allauth 创建自定义注册表单,但出现错误 save() takes 1 positional argument but 2 were given

我知道此错误与 Django Rest Auth 提供的函数 def save(self,request) 相关,但我不知道如何更改它。

我应该怎么做才能让它发挥作用?

Bellow 是我的用户模型和序列化程序的相应代码

# Models.py

class UserManager(BaseUserManager):

    def create_user(self,email,password=None,**extra_fields):
        """Creates and saves a new user"""
        if not email:
            raise ValueError('Users must have an email address')
        user = self.model(email=self.normalize_email(email),**extra_fields)
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self,password,**extra_fields):
        """Creates and saves a new super user"""
        user = self.create_user(email,**extra_fields)
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)

        return user


class User(AbstractBaseUser,PermissionsMixin):
    """Custom user model that supports using email instead of username"""
    email = models.EmailField(max_length=255,unique=True)
    name = models.CharField(max_length=255)
    age = models.PositiveIntegerField(null=True,blank=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'

    required_FIELDS = ['name','age']

    def __str__(self):
        return self.email

# serializers.py

class UserSerializer(serializers.ModelSerializer):
    """Serializer for the users object"""

    class Meta:
        model = get_user_model()
        fields = ('email','password','name','age')
        extra_kwargs = {'password': {'write_only': True,'min_length': 5}}

    def create(self,validated_data):
        """Create a new user with encrypted password and return it"""
        return get_user_model().objects.create_user(**validated_data)

    def update(self,instance,validated_data):
        """Update a user,setting the password correctly and return it"""
        password = validated_data.pop('password',None)
        user = super().update(instance,**validated_data)

        if password:
            user.set_password(password)
            user.save()

        return user


    def save(self,request):
      # I would say that I need to change the default function

# settings. py

REST_AUTH_REGISTER_SERIALIZERS = {
    'REGISTER_SERIALIZER': 'user.serializers.UserSerializer'
}

解决方法

为了解决这个问题,我只需将以下内容添加到我的序列化程序中:

class UserSerializer(serializers.ModelSerializer):
    """Serializer for the users object"""

    class Meta:
        model = get_user_model()
        fields = ('email','password','name','age')
        extra_kwargs = {'password': {'write_only': True,'min_length': 5}}

    def create(self,validated_data):
        """Create a new user with encrypted password and return it"""
        return get_user_model().objects.create_user(**validated_data)

    def update(self,instance,validated_data):
        """Update a user,setting the password correctly and return it"""
        password = validated_data.pop('password',None)
        user = super().update(instance,**validated_data)

        if password:
            user.set_password(password)
            user.save()

        return user

    def get_cleaned_data(self):
        return {
            'password': self.validated_data.get('password',''),'email': self.validated_data.get('email','name': self.validated_data.get('name','age': self.validated_data.get('age',}

    def save(self,request):
        self.cleaned_data = self.get_cleaned_data()
        user = get_user_model().objects.create_user(**self.cleaned_data)

        return user

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。