首页 > 解决方案 > 无法使用 ModelViewSet 更改 Django 用户模型的用户密码

问题描述

我正在使用 ModelViewSet 使用 Django 用户模型。当我请求更新当前登录用户的密码时。虽然我收到 200 OK 响应,但我的密码永远不会更改为我更改的新密码。

我还尝试从我的管理员用户发出请求,当我使用密码发出 PUT 请求时,它被更改为其他内容,并且我从 django 管理面板中注销。

这是我的

视图.py

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    permission_classes = [IsAuthenticated, IsOwnerOfObject]
    authentication_classes = (TokenAuthentication,)

序列化程序.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'username', 'password']

        extra_kwargs = {
            'password' : {
                'write_only':True,
                'required': True
            }
        }
    
    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        Token.objects.create(user=user) # create token for the user
        return user

网址.py

router = DefaultRouter()
router.register('articles', ArticleViewSet, basename='articles')
router.register('users', UserViewSet, basename = 'users')


urlpatterns = [
    path('api/', include(router.urls)),
]

权限.py

class IsOwnerOfObject(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj == request.user

这是我提出请求的方式,在 Headers 字段中使用 Authorization token

在此处输入图像描述

回复 :

在此处输入图像描述

标签: pythondjangodjango-permissionsdjango-auth-modelsdjango-viewsets

解决方案


正如@BrianDestura 所说,您需要调用set_password才能正确更新它。


class UserSerializer(serializers.ModelSerializer):

    # --> Add this method
    def update(self, instance, validated_data):
        # We Can change the username?
        instance.username = validated_data['username']
        instance.set_password(validated_data['password'])
        instance.save()

        return instance


推荐阅读