Django Rest Framework-как создать пользовательские сообщения об ошибках для всех полей ModelSerializer?
это мой serializers.py (я хочу создать сериализатор для встроенной модели пользователя):
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'password', 'email', )
Я знаю, что Django Rest Framework имеет свои собственные валидаторы полей, потому что, когда я пытаюсь создать пользователя, используя имя пользователя, которое уже существует, он вызывает ошибку:
{'username': [u'This field must be unique.']}
Я хочу, чтобы настроить сообщение об ошибке и заставить его сказать: "это имя пользователя уже занято. Попробуйте еще раз" , а не "это поле должно быть уникальным".
это также имеет встроенный валидатор регулярных выражений, потому что, когда я создаю пользователя с восклицательным знаком, он говорит:
{'username': [u'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.']}
Я хочу настроить валидатор регулярных выражений так, чтобы он просто говорил "недопустимое имя пользователя".
как настроить все сообщения об ошибках, которые есть в каждом поле?
примечание: согласно этому сообщению:пользовательские сообщения об ошибках в Django Rest Framework serializer я могу сделать:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
def __init__(self, *args, **kwargs):
super(UserSerializer, self).__init__(*args, **kwargs)
self.fields['username'].error_messages['required'] = u'My custom required msg'
но что я делаю для "уникального" и 'регулярное выражение' валидаторы? Я пытался сделать
self.fields['username'].error_messages['regex'] = u'My custom required msg'
и
self.fields['username'].error_messages['validators'] = u'My custom required msg'
но не работали.
1 ответов
для замены уникальных или регулярных выражений сообщений об ошибках вы должны изменить message
член соответствующего объекта проверки. Это можно сделать с помощью отдельного класса миксин:
from django.core.validators import RegexValidator
from rest_framework.validators import UniqueValidator
from django.utils.translation import ugettext_lazy as _
class SetCustomErrorMessagesMixin:
"""
Replaces built-in validator messages with messages, defined in Meta class.
This mixin should be inherited before the actual Serializer class in order to call __init__ method.
Example of Meta class:
>>> class Meta:
>>> model = User
>>> fields = ('url', 'username', 'email', 'groups')
>>> custom_error_messages_for_validators = {
>>> 'username': {
>>> UniqueValidator: _('This username is already taken. Please, try again'),
>>> RegexValidator: _('Invalid username')
>>> }
>>> }
"""
def __init__(self, *args, **kwargs):
# noinspection PyArgumentList
super(SetCustomErrorMessagesMixin, self).__init__(*args, **kwargs)
self.replace_validators_messages()
def replace_validators_messages(self):
for field_name, validators_lookup in self.custom_error_messages_for_validators.items():
# noinspection PyUnresolvedReferences
for validator in self.fields[field_name].validators:
if type(validator) in validators_lookup:
validator.message = validators_lookup[type(validator)]
@property
def custom_error_messages_for_validators(self):
meta = getattr(self, 'Meta', None)
return getattr(meta, 'custom_error_messages_for_validators', {})
тогда вы можете просто наследовать этот mixin и обновить Meta
класс:
class UserSerializer(SetCustomErrorMessagesMixin, serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')
custom_error_messages_for_validators = {
'username': {
UniqueValidator: _('This username is already taken. Please, try again'),
RegexValidator: _('Invalid username')
}
}