得到 AttributeError 'User' 对象没有属性 'password1'

问题描述 投票:0回答:1

如何修复错误,请帮忙?得到 AttributeError 'User' 对象没有属性 'password1'。

我想添加两个密码字段。用户已创建但发生错误

AttributeError:尝试在序列化器

password1
上获取字段
UserSerializer
的值时出现 AttributeError。 序列化器字段可能命名不正确,并且与
User
实例上的任何属性或键不匹配。 原始异常文本是:“User”对象没有属性“password1”。

views.py

class RegisterAPIView(generics.CreateAPIView):
    serializer_class = UserSerializer
    queryset = User.objects.all()

序列化器.py

class UserSerializer(serializers.Serializer):
    username = serializers.CharField(
        label="Имя пользователя",
        style={"input_type": "username"}
    )
    email = serializers.CharField(
        label="почта",
        style={"input_type": "email"}
    )
    password1 = serializers.CharField(
        label="Пароль",
        style={'input_type': 'password'}
    )
    password2 = serializers.CharField(
        label="Пароль повторно",
        style={'input_type': 'password'}
    )

    def create(self, validated_data):
        password1 = validated_data.pop('password1')
        password2 = validated_data.pop('password2')
        print(validated_data)
        if password1 and password2 and password1 != password2:
            raise ValidationError("Passwords don't match")
        validated_data["password"] = password1
        print(validated_data)
        user = User.objects.create(**validated_data)
        print(user.id)
        return user
python django django-rest-framework django-views django-serializer
1个回答
0
投票

使用模型序列化器,对password2使用 write_only=True 属性,覆盖 validate 方法进行验证,示例:

class UserSignUpSerializer(serializers.ModelSerializer):
# or confirm_password field
password2 = serializers.CharField(write_only=True)

class Meta:
    model = User
    fields = ['username', 'password', 'password2'] # more field you want

def validate(self, data):
    if data.get('password') != data.get('password2'):
        raise serializers.ValidationError(_("passwords are not same."))
    return data

def create(self, validated_data):
    validated_data.pop('password2') # you should pop this before create
    user = User.objects.create_user(
        **validated_data
    )
    return user
© www.soinside.com 2019 - 2024. All rights reserved.