Это мой первый раз, когда вы используете 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} }, поэтому, если ошибка произошла, так как на веб-сайте может отображаться сообщение об ошибке. Однако до сих пор ни одно сообщение не отображается и кажется, что ничего не происходит, когда пользователь нажимает кнопку отправки.
Как вы определяете, что форма недействительна? Также обратите внимание, что вы должны выполнять сравнение паролей внутри метода 'clean' формы, таким образом вы можете вернуть ошибку формы, а не отдельную переменную. –
Можете ли вы попробовать распечатать (form.is_valid()) внутри вашего представления после создания формы? –
@ DanielRoseman Я помещаю печать под формой vaild() и еще, и только печатаю там, где я помещаю другую часть, показывающую в консоли, и пароль был тае, поэтому я догадался, что форма недействительна – camila