【问题标题】:Django : ValueError at form submission, returned noneDjango:表单提交时出现ValueError,没有返回
【发布时间】:2017-07-07 05:17:39
【问题描述】:

我正在处理密码更改表单,其中包含旧密码、新密码并确认新密码。如果旧密码与当前用户的密码不匹配,则会显示错误消息。此外,如果新密码和密码确认不匹配,则会显示错误消息。到目前为止,我不断收到错误消息,我想知道哪一部分出了问题。为什么没有返回?

错误信息

ValueError at /blog/password_change/blue/
   The view blog.views.password_change didn't return an HttpResponse object. It returned None instead.

urls.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 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

views.py

@login_required
def password_change(request, username):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)
        if form.is_valid():            
           oldpassword = form.cleaned_data.get('oldpassword')
           password1 = form.cleaned_data.get('password1')
           password2 = form.cleaned_data.get('password2')
           if password1 == password2:
               update_session_auth_hash(request, form.username)
               form.save()
               return HttpResponseRedirect('/blog/password_change_done/') 
           else:
               return render(request, 'blog/detail.html', {'error_message': 'password mismatch'})

    else:
        form = PasswordChangeForm(user=request.user)
        return redirect(reverse('blog:profile', args=[form.user.get_username()]))

【问题讨论】:

    标签: python django forms web


    【解决方案1】:

    将您的视图更改为以下代码

    @login_required
    def password_change(request, username):
        if request.method == 'POST':
            form = PasswordChangeForm(data=request.POST, user=request.user)
            if form.is_valid():            
               oldpassword = form.cleaned_data.get('oldpassword')
               password1 = form.cleaned_data.get('password1')
               password2 = form.cleaned_data.get('password2')
               if password1 == password2:
                   update_session_auth_hash(request, form.username)
                   form.save()
                   return HttpResponseRedirect('/blog/password_change_done/') 
               else:
                  return render(request, 'blog/detail.html', {'error_message': 'password mismatch'})
        else:
            return render(request, 'blog/detail.html', {'error_messages': form.errors })
    
    else:
        form = PasswordChangeForm(user=request.user)
        return redirect(reverse('blog:profile', args=[form.user.get_username()]))
    

    【讨论】:

      【解决方案2】:

      首先,您的重定向和渲染方式错误;您应该在成功时重定向,并在失败时呈现。

      您的实际问题是由错误的缩进引起的;如果请求是 POST 但表单无效,则没有返回语句。您应该取消缩进最后一行 - 这应该是渲染 - 以便这种情况下到达该行。

      【讨论】:

      • 这是另一个问题,但是一旦我根据您的建议更改了代码,表格似乎变得无效...您知道为什么吗?
      猜你喜欢
      • 2012-02-14
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2013-07-13
      • 2021-07-09
      • 1970-01-01
      • 2017-09-27
      相关资源
      最近更新 更多