python - 如何在 Django Rest Framework 中更新用户密码?

标签 python django django-rest-framework

我想询问以下代码提供了更新密码,但我想在当前密码确认过程后更新密码。那么我应该为它添加什么?谢谢。

class UserPasswordSerializer(ModelSerializer):

    class Meta:
        model = User
        fields = [
            'password'
        ]

        extra_kwargs = {
            "password": {"write_only": True},
        }

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance

最佳答案

我认为使用模型序列化器可能有点过头了。这个简单的序列化器和 View 应该可以工作。

序列化器.py

from rest_framework import serializers
from django.contrib.auth.models import User

class ChangePasswordSerializer(serializers.Serializer):
    model = User

    """
    Serializer for password change endpoint.
    """
    old_password = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

Views.py

from rest_framework import status
from rest_framework import generics
from rest_framework.response import Response
from django.contrib.auth.models import User
from . import serializers
from rest_framework.permissions import IsAuthenticated   

class ChangePasswordView(UpdateAPIView):
        """
        An endpoint for changing password.
        """
        serializer_class = ChangePasswordSerializer
        model = User
        permission_classes = (IsAuthenticated,)

        def get_object(self, queryset=None):
            obj = self.request.user
            return obj

        def update(self, request, *args, **kwargs):
            self.object = self.get_object()
            serializer = self.get_serializer(data=request.data)

            if serializer.is_valid():
                # Check old password
                if not self.object.check_password(serializer.data.get("old_password")):
                    return Response({"old_password": ["Wrong password."]}, status=status.HTTP_400_BAD_REQUEST)
                # set_password also hashes the password that the user will get
                self.object.set_password(serializer.data.get("new_password"))
                self.object.save()
                response = {
                    'status': 'success',
                    'code': status.HTTP_200_OK,
                    'message': 'Password updated successfully',
                    'data': []
                }

                return Response(response)

            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

关于python - 如何在 Django Rest Framework 中更新用户密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38845051/

相关文章:

python - 为什么我的打印功能出现语法错误?

python - 将新行追加到 numpy 数组

django - 在 Django 中,为什么迁移到 Oracle 会导致尝试保存 ID 为空的实例?

angularjs - Django Rest Framework-尝试使用不正确的凭据登录用户时,为什么返回200状态代码?

python - TimeField 上的 Django 过滤器

python - 如何使用 PyGithub 在 repo 中创建一个新目录?

python - django 中的复杂 ORM 查询

python - django 创建自定义表单

python - 没有获取表单以在 Django REST 框架中发布数据

django-rest-framework - 从 Django rest 框架中的访问 token 获取用户详细信息 - 简单的 JWT