1

Это мой UserSerializer (я использую по умолчанию Django модели пользователя):Настройка ModelSerializer игнорируется

class UserSerializer(SetCustomErrorMessagesMixin, serializers.ModelSerializer): 

    def __init__(self, *args, **kwargs): 
      super(UserSerializer, self).__init__(*args, **kwargs) # call the super() 
      for field in self.fields: # iterate over the serializer fields 
       self.fields[field].error_messages['required'] = 'Enter a valid %s.'%field 
       self.fields[field].error_messages['null'] = 'Enter a valid %s.'%field 

       # class CharField(Field) errors 
       self.fields[field].error_messages['blank'] = 'Enter a valid %s.'%field 
       self.fields[field].error_messages['max_length'] = '%s cannot have more than {max_length} characters.'%field 
       self.fields[field].error_messages['min_length'] = '%s cannot have less than {min_length} characters.'%field 

    class Meta: 
     model = User 
     fields = ('username', 'password', 'email',) 

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

"Username is too long." 

Откуда это сообщение об ошибке? Я переписал сообщение об ошибке «max_length» в приведенном выше коде, но он не отображает его. Когда я удалить эту строку из моего UserSerialzer:

self.fields[field].error_messages['max_length'] = '%s cannot have more than {max_length} characters.'%field 

, то сообщение об ошибке:

"Ensure this field has no more than 30 characters." 

который имеет смысл Beause он исходит из исходного кода CharField ФПИ здесь: https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/fields.py

Но где «Имя пользователя слишком длинное». и откуда он не говорит: «Имя пользователя не может содержать больше символов {max_length}». вместо?

+0

Откуда «поле» происходит в вашем '__init__'? – Ivan

+0

@Ivan Извините, что при копировании моего кода я случайно удалил эту строку: «для поля в self.fields:». Я отредактировал мой пост и добавил строку сейчас. Это имеет смысл? – user2719875

+0

Какие версии Django и DRF вы используете? – Ivan

ответ

1

Проблема заключается в том, что DRF добавляет валидаторы для полей во время их построения и копирует сообщения об ошибках из полевых классов.

Например из rest_framework.fields.CharField.__init__:

if self.min_length is not None: 
    message = self.error_messages['min_length'].format(min_length=self.min_length) 
    self.validators.append(MinLengthValidator(self.min_length, message=message)) 

Так что на данный момент вы перезаписать сообщения, они уже используются в валидаторов.

Я думаю, вы можете просто создать yourapp.fields модуль, где вы создаете подкласс DRF поля Serializer и переопределить их default_error_messages, например, так:

from rest_framework import fields 

class CharField(fields.CharField): 

    default_error_messages = { 
     # Your messages 
    } 

А потом просто включите модуль, импортировать поля из.

Вы также можете переопределить __init__ s для добавления имен полей в сообщениях.

+0

Я понимаю, что вы имеете в виду. Быстрый вопрос: просто уточнить, когда я переопределяю сообщения об ошибках: «self.fields [field] .error_messages ['max_length'] = '% s не может иметь больше символов {max_length}.'% Field", что Я делаю, переопределяет валидаторы поля Serializer DRF? И когда я использую код, который вы отправили, я переопределяю валидаторы полей модели Django? – user2719875

+0

Нет, я переопределяю поля serialzer (у меня даже есть импорт в моем коде, который указывает это). Кроме того, если вы хотите получать сообщения с именами полей, вы можете также переопределить '__init__'. – Ivan

Смежные вопросы