1
resposta

[Dúvida] Validação através do validate só acontece por etapas?

Fiz a modificação da validação dos campos, entretanto, ela só ocorre de maneira direta quando erro o padrão de 1 único campo. Se, por algum acaso, eu erro o padrão de 2 ou mais campos ele primeiro notifica 1 e depois o outro. Por exemplo, se eu erro o padrão no campo CPF e do campo celular, após a submissão do formulário ele acusa que o CPF está errado, e só após eu submeter o formulário novamente com o campo CPF validado, ele acusa o erro no campo celular. Existe alguma maneira de manipular isso e apresentar todos os erros juntos?

1 resposta

Olá Denis, tudo bem com você?

Peço desculpas pela demora no retorno.

O comportamento descrito está ocorrendo devido à validação padrão do Django ser executada antes da validação personalizada que foi definida no serializer. Portanto, se houver um erro de validação padrão, ele será retornado antes mesmo de chegar à sua função validate() personalizada. Essa validação padrão, é a que definimos em nosso modelo, onde por exemplo, o tamanho máximo do campo cpf é 11 dígitos, o tamanho máximo do campo celular é 14 e assim sucessivamente.

Todavia, para abarcar as validações do serializer em conjunto, podemos definir um dicionário que coleta todos os erros e os retorna em conjunto, como mostro abaixo:

from rest_framework import serializers
from clientes.models import Cliente
from clientes.validators import *

class ClienteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cliente
        fields = '__all__'
    def validate(self, data):
        errors = {}

        if not cpf_valido(data['cpf']):
            errors['cpf'] = "Número de CPF inválido"
        if not nome_valido(data['nome']):
            errors['nome'] = "Não inclua números neste campo"
        if not rg_valido(data['rg']):
            errors['rg'] = "O RG deve ter 9 dígitos"
        if not celular_valido(data['celular']):
            errors['celular'] = "O número de celular deve seguir este modelo: 11 91234-1234 (respeitando os espaços e traço)"

        if errors:
            raise serializers.ValidationError(errors)

        return data

Abaixo, um gif que apresenta o resultado, após a mudança no arquivo serializers.py:

GIF contendo a exibição de um formulário, onde o usuário informa valores errados para os campos e é apresentado mensagem de erro

Todavia, ressalto que quando houver erros padrões do modelo, será exibido apenas os erros do modelo - o que não inclui as validações personalizadas. Ou seja, se houver erros de validação do modelo, os erros personalizados definidos no método validate do serializer podem não ser acionados.

Espero ter ajudado. Continue mergulhando em conhecimento e não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!