Използвам формуляри 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 за отговор № 1form.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"
така че може да се наложи да адаптирате шаблона си.