/ / Програмата работи добре при отстраняване на грешки, но се срива при нормално пускане - python, django

Програмата работи добре при отстраняване на грешки, но се срива при нормално пускане - python, django

Използвам формуляри Django, за да променя потребителската парола, когато я забравят:

#views.py
def change_forgotten_password(request, key):
if request.method == "GET":
form = ChangePasswordForm()
return render(request, "freelancestudent/change_forgotten_password.html", {"form": form})
else:  # post
form = ChangePasswordForm(request.POST)
if form.is_valid():
user = User.objects.get(forgot_password_key=key)
user.set_password(form.cleaned_data["password"])
user.save()
return redirect("/")

#forms.py
class ChangePasswordForm(forms.Form):
password = forms.CharField(widget=forms.PasswordInput)
confirm_password = forms.CharField(widget=forms.PasswordInput)

def is_valid(self):
if self.cleaned_data["password"] == self.cleaned_data["confirm_password"]:
return True

Когато преминавам през кода си с помощта на програмата за отстраняване на грешки на PyCharm, всичко работи точно както аз искам; ако паролите съвпадат, той актуализира паролата на избрания потребител. Ако обаче го пусна като (python manage.py runserver) представя грешката:

AttributeError at /change-forgotten-password/wemnj8vvk37yvikf/

"ChangePasswordForm" object has no attribute "cleaned_data"

на линия в forms.py който гласи:

if self.cleaned_data["password"] == self.cleaned_data["confirm_password"]:
...

Отговори:

1 за отговор № 1

form.cleaned_data се попълва от form.is_valid(), Забравили сте да се обадите на супер изпълнение във вашата форма.

def is_valid(self):
return (
super(ChangePasswordForm, self).is_valid()
and self.cleaned_data["password"] == self.cleaned_data["confirm_password"]
)

Като цяло, обаче, аз ще обезкуража първостепенното is_valid() и вместо това да замени form.clean() или подобна. Както посочи Брандън, django вече го прави в своя SetPasswordForm:

def clean_new_password2(self):
password1 = self.cleaned_data.get("password")
password2 = self.cleaned_data.get("confirm_password")
if password1 and password2:
if password1 != password2:
raise forms.ValidationError(
self.error_messages["password_mismatch"],
code="password_mismatch",
)
password_validation.validate_password(password2, self.user)
return password2

Може да изчезне и просто да използвате повторно съществуващите ChangePasswordForm, който приема полета "old_password", "new_password1", и "new_password2" така че може да се наложи да адаптирате шаблона си.