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