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 № 1password
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.")