Формат сообщений об ошибках DRF - PullRequest
0 голосов
/ 29 августа 2018

Мне было интересно, если кто-нибудь знает, почему DRF не использует первую букву пользовательского объекта в сообщении об ошибке и есть простой способ исправить это?

Сообщение об ошибке для создания пользователя:

{
    "password": [
        "This field is required."
    ],
    "email": [
        "user with this email already exists."
    ]
}

models.py

class User(AbstractBaseUser, PermissionsMixin):

    created = models.DateTimeField(auto_now_add=True) 
    email = models.EmailField(max_length=255, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def get_full_name(self):

        return self.email

    def get_short_name(self):

        return self.email

    def __str__(self):

        return self.email

serializers.py

class RegisterUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.User
        fields = ('id', 'password', 'email')
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = models.User(email=validated_data['email'])
        user.set_password(validated_data['password'])
        user.save()
        return user

views.py

class UserListView(generics.ListCreateAPIView):
    queryset = User.objects.all()
    def create(self, request, *args, **kwargs):
        serializer = RegisterUserSerializer(data=request.data)
        if serializer.is_valid():
            self.perform_create(serializer)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Чтобы ответить на ваш вопрос:

почему DRF не использует первую букву пользовательского объекта с заглавной буквы

Если явно не указано, DRF создает уникальное сообщение об ошибке, например:

unique_error_message = unique_error_message % {
            'model_name': model_field.model._meta.verbose_name,
            'field_label': model_field.verbose_name
        }

А для пользовательской модели django подробное имя:

>>> from django.contrib.auth.models import User
>>> User.Meta.verbose_name
'user'
0 голосов
/ 29 августа 2018

Самый простой способ сделать это -

class User(AbstractBaseUser, PermissionsMixin):

    created = models.DateTimeField(auto_now_add=True) 
    email = models.EmailField(max_length=255, unique=True,error_messages={
                            'unique': "User with this email already exists.",
                        },)
    ...
...