/ / ModelForm não encontrou o campo ao enviar - django, django-forms

ModelForm não encontra campo ao enviar - django, django-forms

Atualmente, tenho este ModelForm para validar um novo registro de usuário:

class RegistrationForm(forms.ModelForm):
email = forms.CharField(max_length=75, required=True)
password = forms.PasswordInput()
password_confirm = forms.PasswordInput()

class Meta:
model = User
fields = ["username", "email", "password"]

def clean(self):
if self.password != self.password_confirm:
self.add_error("password_confirm", "Passwords do not match.")

O usuário deve confirmar sua senha. Ao enviar este formulário, recebo o seguinte erro:

ValueError em / register

"RegistrationForm" não tem um campo denominado "password_confirm".

Tentei usar self.cleaned_data também, mas ainda obtenho o mesmo erro.

O atributo fields não pode ser removido e nem password_confirm pode ser adicionado a ele.

Como alguém faria para consertar isso?

Respostas:

2 para resposta № 1

password e password_confirm são definidos como widgets, não campos de formulário.

Defina dois CharFields e passe o argumento do widget:

class RegistrationForm(forms.ModelForm):
email = forms.CharField(max_length=75, required=True)
password = forms.CharField(widget=forms.PasswordInput)
password_confirm = forms.CharField(widget=forms.PasswordInput)

2 para resposta № 2

Você precisa chamar o super clean primeiro e, em seguida, deve usar os dados limpos em vez do campo.

def clean(self):
cleaned_data = super(RegistrationForm, self).clean()
if cleaned_data.get("password") != cleaned_data.get("password_confirm"):
self.add_error("password_confirm", "Passwords do not match.")