2017-02-17 12 views
0

Я работаю над формой смены пароля, где беру старый пароль, новый пароль и подтверждают новый пароль. Если старый пароль не совпадает с паролем текущего пользователя, отображается сообщение об ошибке. Кроме того, если новый пароль и пароль не совпадают, отображается сообщение об ошибке. Пока я продолжаю получать сообщения об ошибках, и я хочу знать, какая часть пошла не так. Почему он не возвращает ни одного?Django: ValueError при отправке формы, не возвращается

сообщение об ошибке

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()])) 

ответ

0

Измените ваш взгляд ниже код

@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()])) 
0

Прежде всего, у вас есть редирект и сделать навыворот; вы должны перенаправить на успех и выполнить сбой.

Ваша фактическая проблема, хотя и вызвана неправильным отступом; если запрос POST, но форма недействительна, нет оператора возврата. Вы должны отменить последнюю строку, которая должна быть рендером, чтобы этот случай попадал в эту строку.

+0

Это еще одна проблема, но как только я изменил код по вашему предложению, кажется, что форма становится недействительной ... Знаете почему? – camila