Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 程序在调试时运行良好,但在正常运行时崩溃_Python_Django - Fatal编程技术网

Python 程序在调试时运行良好,但在正常运行时崩溃

Python 程序在调试时运行良好,但在正常运行时崩溃,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})

我使用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']:
    ...

form.cleaned\u数据由
form.is\u valid()
填写。您忘了在表单中调用超级实现

def is_valid(self):
    return (
       super(ChangePasswordForm, self).is_valid()
       and self.cleaned_data['password'] == self.cleaned_data['confirm_password']
    )
但是,一般来说,我不鼓励重写
是有效的()
,而是重写
form.clean()
或类似的。正如Brandon所指出的,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

您可能会干涸,只需重新使用现有的,它接受字段
'old\u password'
'new\u password1'
,和
'new\u password2'
,因此您可能需要调整模板。

自我。已清理的\u数据由验证检查填充。但是,您从不调用super(ChangePasswordForm,self)。is\u valid()
。您可能也不想覆盖
is\u valid()
,而是要覆盖
clean()
并引发
验证错误,因为您当前在验证失败时没有收到可显示的错误消息。我在哪里调用它?在访问
自清理数据之前,在您的覆盖
is\u valid()
中。但是请参见上面的首选方法。为什么要重新发明轮子@德克工作很愉快。把它作为一个答案,这样我可以标记它正确,如果你想。