ошибка проверки настраиваемого поля не показывает имя поля - PullRequest
1 голос
/ 08 мая 2019

Я хочу реализовать конечную точку смены пароля, у меня есть это представление:

 def update(self, request):
    user_data = {}
    classname = __class__.__name__
    function = 'update'
    try:
        user = request.user
        current = request.data['current']
        password = request.data['password']
        confirm = request.data['confirm']
        serializer = serializers.ChangePasswordSerializer(user, data=request.data)
        if serializer.is_valid():
            serializer.save(updated_by=request.user.username, updated_date=timezone.now())
            logger(request, msg=_("Added Successfully"), level="normal", classname=classname,
                   function=function,
                   user_data=user_data, status=status.HTTP_205_RESET_CONTENT)
            return Response({"message": _("Added Successfully")}, status=status.HTTP_205_RESET_CONTENT)
        logger(request, msg=serializer.errors, level="error", classname=classname, function=function,
               user_data=user_data, status=status.HTTP_422_UNPROCESSABLE_ENTITY)
        return Response({'errors': serializer.errors}, status=status.HTTP_422_UNPROCESSABLE_ENTITY)

    except Exception as ValidationError:
        return Response({"errors": _("Current password is not correct")}, status=status.HTTP_422_UNPROCESSABLE_ENTITY)

    except Exception as e:
        elogger(msg=e.args)
        return Response({"message": _("status500")}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

, и это мой сериализатор:

 class ChangePasswordSerializer(DynamicFieldsModelSerializer):
     current = serializers.CharField()
     confirm = serializers.CharField()

    def validate(self, data):
        if data['current'] == data['password']:
            raise serializers.ValidationError("Password and Current password should not be the same")
        if data['confirm'] != data['password']:
            raise serializers.ValidationError("Password and Confirm password did not match")
        return data

    class Meta:
        model = models.User
        fields = ('password', 'current', 'confirm')
        validators = []

    def update(self, instance, validated_data):
        if not instance.check_password(validated_data.get('current')):
            raise serializers.ValidationError("Current password is not correct")
        else:
            instance.set_password(validated_data['password'])
            instance.save()
        return instance

Моя первая проблема заключается в том, что я получаю эту проверкуошибка:

{
   "errors": {
      "non_field_errors": [
         "Password and Current password should not be the same"
      ]
   }
}

Я хочу, чтобы мое поле имело имя вместо "non_field_errors", также я хочу, чтобы моя функция проверки пароля была внутри функции проверки, но я не знаю, как

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Чтобы получить ошибку проверки полей, вы должны вызвать ошибку из функции validate_fieldname, подтвердить пароль подтверждения.

class ChangePasswordSerializer(DynamicFieldsModelSerializer):
    current = serializers.CharField()
    confirm = serializers.CharField()

    def validate_current(self, value):
        if value == self.initial_data['password']:
            raise serializers.ValidationError("Password and Current password should not be the same")
        return value

    def validate_confirm(self, value):
        if value != self.initial_data['password']:
            raise serializers.ValidationError("Password and Confirm password did not match")
        return value

    class Meta:
        model = models.User
        fields = ('password', 'current', 'confirm')
        validators = []

    def update(self, instance, validated_data):
        if not instance.check_password(validated_data.get('current')):
            raise serializers.ValidationError("Current password is not correct")
        else:
            instance.set_password(validated_data['password'])
            instance.save()
        return instance
1 голос
/ 08 мая 2019

Если вы вызываете ошибку проверки из validate() метода, используйте dict в качестве сообщения об ошибке,

<b>msg = {"field_name_1": "Password and Confirm password did not match"}</b>
raise serializers.ValidationError(<b>msg</b>)

фрагмент кода

# serializer.py
class ChangePasswordSerializer(DynamicFieldsModelSerializer):
    foo = serializers.CharField()
    bar = serializers.IntegerField()

    # your code

    <b>def validate(self, data):
        data = super().validate(data)
        errors = []
        if data['current'] == data['password']:
            msg_1 = {"field_name_1": "Password and Current password should not be the same"}
            errors.append(msg_1)

        if data['confirm'] != data['password']:
            msg_2 = {"field_name_2": "Password and Confirm password did not match"}
            errors.append(msg_2)
        if errors:
            raise serializers.ValidationError({"errors": errors})
        return data</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...