Tôi đang gặp vấn đề với người dùng Django thay đổi mật khẩu - Tôi đã xây dựng một vài trang web sản xuất ở Django, chỉ trong vòng một năm (hoặc 1.8), nhưng tôi không nhớ vấn đề này trước đây.django người dùng đăng xuất sau khi thay đổi mật khẩu
Tóm tắt
Khi người dùng thay đổi mật khẩu của họ, người dùng được đăng xuất, nhưng mật khẩu được thay đổi thành công.
Chi tiết
tôi có một cái nhìn, cho phép người dùng thay đổi mật khẩu, Tôi đang sử dụng hình thức django tiêu chuẩn và khuôn khổ auth, và căng thẳng: thay đổi các công trình mật khẩu, nó chỉ ghi lại người dùng ra để họ phải đăng nhập lại. Tôi thực sự không nhớ điều này một cách khủng khiếp, tôi muốn người dùng được chuyển hướng đến trang tổng quan của họ bằng bản cập nhật tin nhắn, nếu tôi cần làm lại người dùng trong mã, thì tôi sẽ, dường như có vẻ hơi vụng về.
đây là chức năng quan điểm của tôi:
@login_required
def user_change_password(request):
"""Allows a user to change their password"""
if request.method == "POST":
form = SubscriberPasswordForm(request.POST)
if form.is_valid():
try:
request.user.set_password(form.cleaned_data['password'])
request.user.save()
except Exception, err:
print "Error changing password: {}".format(err)
messages.add_message(request, messages.ERROR, 'The password could not be changed, please try again '
'later. This admins have been notified of this error.')
else:
#this outputs True
print request.user.is_authenticated()
messages.add_message(request, messages.INFO, 'Your password has been changed successfully')
return HttpResponseRedirect("/accounts/dashboard/")
else:
form = SubscriberPasswordForm()
return render(request, "accounts/change-password.html", {"form": form})
Vì vậy, các mật khẩu được thay đổi, người dùng được chuyển hướng đến trang bảng điều khiển, các trang trí @login_required sau đó sẽ chuyển hướng họ trở lại màn hình đăng nhập.
Biểu mẫu mật khẩu ở đây, mặc dù nó khá đơn giản.
class SubscriberPasswordForm(forms.Form):
password = forms.CharField(widget=forms.PasswordInput)
cpassword = forms.CharField(widget=forms.PasswordInput)
def clean_cpassword(self):
password1 = self.cleaned_data.get("password")
password2 = self.cleaned_data.get("cpassword")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'],
code='password_mismatch',
)
này là đi điều od; và bạn nên làm điều này anyway. Nó được kích hoạt theo mặc định trong 1.7 –