Как настроить сообщение об ошибке по умолчанию для пустого имени пользователя при входе в систему
учетные данные для входа в систему :
{
"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
...