Как настроить сообщение об ошибке по умолчанию для пустого имени пользователя при входе в систему

учетные данные для входа в систему :

{
    "account_id":"",
    "password":"abdu@123"
}

ответ :

{
  "account_id": [
    "This field may not be blank."
  ]
}

Эта ошибка возникает из-за rest_framework.fields.CharField. Я попытался переопределить его, сделав :

class MyField(CharField):
    default_error_messages = {
        'invalid': _('Not a valid string.'),
        'blank': _('This field may not be blank changed......'),
        'max_length': _('Ensure this field has no more than {max_length} characters.'),
        'min_length': _('Ensure this field has at least {min_length} characters.'),
    }

Это не меняет сообщение об ошибке. Мой сериализатор :

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    
    @classmethod
    def get_token(cls, user):
        ...
        return token

    def validate(self, attrs):
       ... 

        
        data = super(MyTokenObtainPairSerializer, self).validate(attrs)
        data.update({"user_id": self.user.account_seq})
        data.update({"account_id": self.user.account_id})
        data.update({"is_migrated": int(self.user.is_migrated)})
        data.update({"role": self.user.authority})
        return data

models.py:

class User(AbstractBaseUser):
   ...
    account_id = models.CharField(max_length=255, unique=True)
   ...

Я думаю, что вам не нужно создавать собственное поле. Вы можете просто добавить атрибут error_messages, как показано ниже.

class User(AbstractBaseUser):
    ...
    account_id = models.CharField(max_length=255, unique=True, error_messages = {
        'blank': '...',
        'null': '...',
        'invalid': '...',
        'max_length': '...'
    })

Один из способов сделать это заключается в следующем

class LoginSerializer(serializers.Serializer):
    account_id = serializers.CharField()
    password = serializers.CharField()
.
    def validate(self, attrs):
        errors = dict()
        if attrs['account_id'] == "" or attrs['account_id'] is None:
            errors["account_id"] = "Account ID may not be empty"
            raise serializers.ValidationError(errors)
        return super().validate(attrs)

Сначала будет произведена проверка с помощью вашей пользовательской логики, а с помощью super() будет произведена проверка с помощью встроенной логики. Если вы поймаете ошибки типа до встроенной, вы можете предоставить пользовательские сообщения об ошибках

Это сработало для меня:

Я переопределил init метод TokenObtainPairSerializer и вручную проверил, пуст ли запрос, а затем выбросил пользовательскую ошибку.

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):

    def __init__(self, *args, **kwargs):
        acc_id = kwargs.get('data').get("account_id")
        password = kwargs.get('data').get("password")
        if not acc_id:
            raise MyCustomExcpetion(
                detail={"error": "account id cannot be empty"}, status_code=status.HTTP_403_FORBIDDEN
            )
        val = super().__init__(self,*args,**kwargs)
        return val

    ...
Вернуться на верх