Python django:SetPasswordForm无效,没有错误

Python django:SetPasswordForm无效,没有错误,python,django,forms,web,passwords,Python,Django,Forms,Web,Passwords,这是我第一次使用SetPasswordForm。表单无效,但未显示错误消息。所以我很难找出哪个部分出了问题 url.py url(r'^password_change/(?P<username>[-\w.]+)/$', views.password_change, name='password_change'), url(r'^password_change_done/$', views.password_change_done, name='password_change_done

这是我第一次使用SetPasswordForm。表单无效,但未显示错误消息。所以我很难找出哪个部分出了问题

url.py

url(r'^password_change/(?P<username>[-\w.]+)/$', views.password_change, name='password_change'),
url(r'^password_change_done/$', views.password_change_done, name='password_change_done'),
forms.py

class PasswordChangeForm(SetPasswordForm):
    error_messages = dict(SetPasswordForm.error_messages, **{
    'password_incorrect': ("Your old password was entered incorrectly. Please enter it again."),
    })
    oldpassword = forms.CharField(
        label=("Old password"),
        strip=False,
        widget=forms.PasswordInput(attrs={'autofocus': True}),
    )
    field_order = ['oldpassword', 'password1', 'password2']
    def __init__(self, user, data, **kwargs):
        self.user = user
        super(PasswordChangeForm, self).__init__(data, **kwargs)
    def clean_oldpassword(self):
        oldpassword = self.cleaned_data["oldpassword"]
        if not self.user.check_password(oldpassword):
            raise forms.ValidationError(
                self.error_messages['password_incorrect'],
                code='password_incorrect',
            )
        return oldpassword
templates.py

{{ form.errors }}
{{ form.non_field_errors }}
{% if error_message %}
    <h2><strong>{{ error_message }}</strong></h2>
{% else %}<br>
{% endif %}
<form class="form-horizontal" role="form" action="{% url 'blog:password_change' user.username %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="button-primary">submit</button></div>
</form>
{{form.errors}
{{form.non_field_errors}}
{%if错误消息%}
{{error\u message}}
{%else%}
{%endif%} {%csrf_令牌%} {{form.as_p}} 提交

我把{form.errors}}和{{form.non_field_errors}}放进去,这样如果发生错误,它就可以在网站上显示错误消息。但是,到目前为止,没有显示任何消息,每当用户单击“提交”按钮时,似乎什么也没有发生。

这里有很多问题,但正如我之前告诉您的,主要问题是如何将内容传递给模板。您需要遵循文档中所示的模式,并且需要在变量命名方面保持一致

首先,将密码检查移动到表单本身:

class PasswordChangeForm(SetPasswordForm):
    ...
    def clean(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 1= password2:
            raise forms.ValidationError('password mismatch')
现在,修复您的视图:

def password_change(request, username):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)
        if form.is_valid():
            update_session_auth_hash(request, form.username)
            form.save()
            return HttpResponseRedirect('/blog/password_change_done/') 
        else:
            return render(request, 'blog/profile.html', {'form': form })
    else:
        return redirect(reverse('blog:profile', args=[username]))

最后,从模板中删除
{{error\u messages}}

这里有很多问题,但是主要的问题-正如我之前告诉过你的-是如何将内容传递给模板。您需要遵循文档中所示的模式,并且需要在变量命名方面保持一致

首先,将密码检查移动到表单本身:

class PasswordChangeForm(SetPasswordForm):
    ...
    def clean(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 1= password2:
            raise forms.ValidationError('password mismatch')
现在,修复您的视图:

def password_change(request, username):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)
        if form.is_valid():
            update_session_auth_hash(request, form.username)
            form.save()
            return HttpResponseRedirect('/blog/password_change_done/') 
        else:
            return render(request, 'blog/profile.html', {'form': form })
    else:
        return redirect(reverse('blog:profile', args=[username]))

最后,从模板中删除
{{error\u messages}}

如何确定表单无效?还要注意,您应该在表单的
clean
方法中进行密码比较,这样您就可以返回一个表单错误,而不是单独的变量。创建表单后,您可以在视图中尝试打印(form.is_valid())吗?@DanielRoseman I将打印放在form is vaild()下,否则,只在控制台显示的else部分打印,密码是thae smae,所以我猜表单不是valid@DanielRoseman我不明白我应该在表单的clean方法中使用密码comaprison。在clean方法之后进行比较不起作用?嗯,错误不会显示,因为您没有将表单或名为“error\u message”的变量传递给模板,您只传递带有s的“error\u messages”。实际上,您应该只返回表单。您如何确定表单无效?还要注意,您应该在表单的
clean
方法中进行密码比较,这样您就可以返回一个表单错误,而不是单独的变量。创建表单后,您可以在视图中尝试打印(form.is_valid())吗?@DanielRoseman I将打印放在form is vaild()下,否则,只在控制台显示的else部分打印,密码是thae smae,所以我猜表单不是valid@DanielRoseman我不明白我应该在表单的clean方法中使用密码comaprison。在clean方法之后进行比较不起作用?嗯,错误不会显示,因为您没有将表单或名为“error\u message”的变量传递给模板,您只传递带有s的“error\u messages”。真的,你应该返回表单。当我使用清理过的_数据时,它应该不是self??当我使用清理过的_数据时,它应该不是self??