Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django User.set_密码导致密码无效_Django_Django Rest Framework_Django Users - Fatal编程技术网

Django User.set_密码导致密码无效

Django User.set_密码导致密码无效,django,django-rest-framework,django-users,Django,Django Rest Framework,Django Users,我正在尝试编写一个序列化程序(在Django REST框架中)来更新用户的帐户详细信息。下面是update()方法: 当我以“password”、“confirm_password”和“old_password”作为字段对视图执行补丁请求时,它似乎已经工作了。然后,当我再次尝试登录该帐户时,它失败了(使用旧密码和新密码)。当我检查管理员设置并查看我试图编辑的用户时,我得到以下信息: 密码格式无效或哈希算法未知。 未存储原始密码,因此无法查看此用户的密码 密码,但您可以使用此表单更改密码 我相信U

我正在尝试编写一个序列化程序(在Django REST框架中)来更新用户的帐户详细信息。下面是update()方法:

当我以“password”、“confirm_password”和“old_password”作为字段对视图执行补丁请求时,它似乎已经工作了。然后,当我再次尝试登录该帐户时,它失败了(使用旧密码和新密码)。当我检查管理员设置并查看我试图编辑的用户时,我得到以下信息:

密码格式无效或哈希算法未知。

未存储原始密码,因此无法查看此用户的密码 密码,但您可以使用此表单更改密码


我相信User.set\u password()应该自动处理散列等操作,那么我为什么会出现这个错误呢?

您从
self.validated\u data
中删除了
password
,而不是从传递给超类的
update
方法的
validated\u data
中删除了
。试试这个:

validated_data.pop("password") # remove self, just leave validated_data

return super(UserInfoSerializer, self).update(instance, validated_data)

如果有人对使用我的代码感兴趣,以下是最终的工作代码:

def update(self, instance, validated_data):
    ...
    if all([item in validated_data for item in ["password", "confirm_password", "old_password"]]):
        user = authenticate(username=instance.username, password=validated_data["old_password"])
        if user is not None and user == instance:
            if validated_data["password"] == validated_data["confirm_password"]:
                validate_password(validated_data["password"])
                instance.set_password(validated_data["password"])
                instance.save()  # change the password on the current instance object, otherwise changes will be overwritten
                login(self.context["request"], instance)  # without this line, the user is auto-logged out upon changing their password
            else:
                raise serializers.ValidationError({"confirm_password": "Passwords do not match"})
        else:
            raise serializers.ValidationError({"old_password": "Password incorrect"})

    if "password" in validated_data:
        validated_data.pop("password")

    return super(UserInfoSerializer, self).update(instance, validated_data)
def update(self, instance, validated_data):
    ...
    if all([item in validated_data for item in ["password", "confirm_password", "old_password"]]):
        user = authenticate(username=instance.username, password=validated_data["old_password"])
        if user is not None and user == instance:
            if validated_data["password"] == validated_data["confirm_password"]:
                validate_password(validated_data["password"])
                instance.set_password(validated_data["password"])
                instance.save()  # change the password on the current instance object, otherwise changes will be overwritten
                login(self.context["request"], instance)  # without this line, the user is auto-logged out upon changing their password
            else:
                raise serializers.ValidationError({"confirm_password": "Passwords do not match"})
        else:
            raise serializers.ValidationError({"old_password": "Password incorrect"})

    if "password" in validated_data:
        validated_data.pop("password")

    return super(UserInfoSerializer, self).update(instance, validated_data)