2017-02-18 22 views
0

Это мой первый раз, когда вы используете SetPasswordForm. Форма недействительна, но не отображает сообщение об ошибке. Поэтому мне трудно найти, какая часть пошла не так.django: SetPasswordForm недействителен без ошибок

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'), 

При вводе пользователем их новый пароль и, если действие успешно, страница будет перенаправлять на password_change_done.

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/profile.html', {'error_message': 'password mismatch'}) 
     else: 
     return render(request, 'blog/profile.html', {'error_messages': form.errors }) 
    else: 
     return redirect(reverse('blog:profile', args=[form.user.get_username()])) 


@login_required 
def password_change_done(request): 
return render(request, 'blog/password_change_done.html') 

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} }, поэтому, если ошибка произошла, так как на веб-сайте может отображаться сообщение об ошибке. Однако до сих пор ни одно сообщение не отображается и кажется, что ничего не происходит, когда пользователь нажимает кнопку отправки.

+0

Как вы определяете, что форма недействительна? Также обратите внимание, что вы должны выполнять сравнение паролей внутри метода 'clean' формы, таким образом вы можете вернуть ошибку формы, а не отдельную переменную. –

+0

Можете ли вы попробовать распечатать (form.is_valid()) внутри вашего представления после создания формы? –

+0

@ DanielRoseman Я помещаю печать под формой vaild() и еще, и только печатаю там, где я помещаю другую часть, показывающую в консоли, и пароль был тае, поэтому я догадался, что форма недействительна – camila

ответ

0

У вас здесь немало проблем, но главная проблема - как я уже говорил вам, - это то, как вы передаете вещи в шаблон. Вам нужно следовать шаблону, как показано в документации, и вы должны быть согласным о вашем именовании переменных.

Во-первых, переместить проверку пароля к самой форме:

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_messages }} из шаблона.

+0

Когда я использую cleaned_data, он должен формироваться не сам ?? – camila

+0

Вы правы, конечно, исправлены. –