Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Validação das senhas

Tentei criar a validação das senhas utilizando o clean_password1, dessa forma:

class CadastroForms(forms.Form):
   ...
    password1 = forms.CharField(
        ...
            }
        )
    )
    password2 = forms.CharField(
        ...
            }
        )
    )
            
    def clean_password1(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')

        if password1 and password2:
            if password1 != password2:
                raise forms.ValidationError('Senhas não são iguais.')
            return password1

No entanto, mesmo com senhas diferentes, ele permitia o cadastro. Quando troquei o método para "clean_password2", a validação aconteceu sem problemas. Por quê?

1 resposta
solução!

Olá, Victor! Tudo bem?

Bem curiosa essa sua situação, tive que pesquisar um pouco para tentar entendê-la, e imagino que cheguei a um veredito.

Quando você chama o método is_valid() em um formulário, o Django executa uma série de métodos de limpeza e validação em cada campo do formulário. Esses métodos são chamados na ordem em que os campos são definidos na classe do formulário.

No seu caso, você está tentando validar password1 em relação a password2 no método clean_password1. No entanto, neste ponto do processo de validação, password2 ainda não foi limpo e validado, por isso, quando você tenta acessá-lo com self.cleaned_data.get('password2'), ele retorna None.

Quando você move a validação para o método clean_password2, funciona porque, neste ponto, password1 já foi limpo e validado, então você pode acessá-lo com self.cleaned_data.get('password1').

Então, para resumir, a ordem em que os campos são limpos e validados é importante quando um campo depende do outro para a validação, e como no método você atribuiu o nome _password1 o mesmo foi validado sem a precisar de validar a segunda senha.

Espero ter ajudado e bons estudos!

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