【问题标题】:Django Rest - "serializer.data" is empty dict() even though "serializer" has data with detailsDjango Rest-“serializer.data”是空的dict(),即使“serializer”有详细的数据
【发布时间】:2020-11-25 18:43:22
【问题描述】:

我试图根据 stackoverflow 上的一些建议来实施密码更改,但有些东西不起作用,这对我来说真的很奇怪。故障排除后,我得到了想法数据,但我的视图不起作用。将序列化器操作更改为打印我看到数据“serializer.data”是结果“{}”,即使“print(serializer)”给出结果。

序列化器.py

class ChangePasswordSerializer(serializers.Serializer):
    old_password = serializers.CharField(max_length=128, write_only=True, required=True)
    new_password1 = serializers.CharField(
        max_length=128, write_only=True, required=True
    )
    new_password2 = serializers.CharField(
        max_length=128, write_only=True, required=True
    )

    def validate_old_password(self, value):
        user = self.context["request"].user
        if not user.check_password(value):
            raise serializers.ValidationError(
                {
                    "old_passowrd": _(
                        "Your old password was entered incorrectly. Please enter it again."
                    )
                }
            )
        return value

    def validate(self, data):
        if data["new_password1"] != data["new_password2"]:
            raise serializers.ValidationError(
                {"new_password2": _("The two password fields didn't match.")}
            )
        validate_password(data["new_password1"], self.context["request"].user)
        return super().validate(data)

views.py

class ChangePassword(UpdateAPIView):
    serializer_class = ChangePasswordSerializer
    permission_classes = [IsAuthenticated]

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

    def update(self, request, *args, **kwargs):
        self.object = self.get_object()
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            # user.set_password(serializer.data.get("new_password1"))
            # user.save()
            print(serializer.data)
            return Response("Success", status=status.HTTP_204_NO_CONTENT)
        return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)

【问题讨论】:

    标签: django rest serialization


    【解决方案1】:

    'write_only=True' 字段在序列化表示时不包括在内。如果要调试,可以打印request.data 或删除参数 write_only 或将其设置为 False。

    https://www.django-rest-framework.org/api-guide/fields/

    【讨论】:

    • 非常感谢,我明白了。请再问一个问题,与我的用户关联的令牌是否在更改密码时被删除,或者我必须为其添加功能?
    • 如果您使用默认令牌身份验证,则需要手动生成新令牌。
    • 我正在使用 Simple JWT
    • 知道了就可以使用下面的函数了。 from rest_framework_simplejwt.tokens import RefreshTokenRefreshToken.for_user(request.user)
    猜你喜欢
    • 2015-06-10
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多