[英]How to allow users to change their own passwords in Django?
任何人都可以指出我的代碼,用戶可以在 Django 中更改自己的密碼嗎?
Django 帶有一個用戶認證系統。 它處理用戶帳戶、組、權限和基於 cookie 的用戶會話。 本文檔解釋了事情是如何運作的。
請參閱更改密碼部分
導航到manage.py
文件所在的項目
$ python manage.py shell
鍵入以下腳本:
from django.contrib.auth.models import User u = User.objects.get(username__exact='john') u.set_password('new password') u.save()
您還可以使用簡單的manage.py
命令:
manage.py changepassword *username*
只需輸入兩次新密碼。
來自文檔中的更改密碼部分。
如果您的INSTALLED_APPS
有django.contrib.admin
,您可以訪問: example.com/path-to-admin/password_change/
它將有一個表單來確認您的舊密碼並輸入兩次新密碼。
你也可以在你的 URLconf 中使用django.contrib.auth.views.password_change
視圖。 它使用默認的表單和模板; 提供你自己的是可選的。
它不需要去shell輸入passwd並重新輸入passwd
python manage.py changepassword <username>
or
/manage.py changepassword <username>
使用外殼
python manage.py shell
from django.contrib.auth.models import User
users=User.objects.filter(email='<user_email>')
#you can user username or etc to get users query set
#you can also use get method to get users
user=users[0]
user.set_password('__enter passwd__')
user.save()
exit()
本教程展示了如何使用基於函數的視圖來做到這一點:
查看文件:
from django.contrib import messages
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.forms import PasswordChangeForm
from django.shortcuts import render, redirect
def change_password(request):
if request.method == 'POST':
form = PasswordChangeForm(request.user, request.POST)
if form.is_valid():
user = form.save()
update_session_auth_hash(request, user) # Important!
messages.success(request, 'Your password was successfully updated!')
return redirect('change_password')
else:
messages.error(request, 'Please correct the error below.')
else:
form = PasswordChangeForm(request.user)
return render(request, 'accounts/change_password.html', {
'form': form
})
網址文件:
from django.conf.urls import url
from myproject.accounts import views
urlpatterns = [
url(r'^password/$', views.change_password, name='change_password'),
]
最后,模板:
<form method="post">
{% csrf_token %}
{{ form }}
<button type="submit">Save changes</button>
</form>
urls.py
:
urlpatterns = [
url(r'^accounts/', include('django.contrib.auth.urls')),
模板:
<a href="{% url 'password_change' %}">{% trans "Change password" %}</a>
記錄在: https : //docs.djangoproject.com/en/1.9/topics/auth/default/#using-the-views
一旦如 Ciro Santilli 的回答所示添加了 url 模式,允許用戶更改密碼的一種快速方法是為他們提供管理功能的“員工訪問權限”。 如果您沒有將他們添加到任何組或授予他們特殊權限,他們仍然可以通過訪問 example.com/admin 頁面來更改他們的密碼。 員工訪問讓他們即使頁面是空白的也能進入; 在右上角,他們可以單擊“更改密碼”並使用管理功能。
這是我使用的命令,以防萬一您在 throw AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
中遇到問題AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'
。
python manage.py shell -c "from django.contrib.auth import get_user_model;
User = get_user_model();
u = User.objects.get(username='admin');
u.set_password('password123');
u.save()"
根據文檔,使用:
from django.contrib.auth.hashers import makepassword
這樣做的主要原因是 Django 使用散列密碼存儲在數據庫中。
password=make_password(password,hasher='default')
obj=User.objects.filter(empid=emp_id).update(username=username,password=password)
我將此技術用於從AbstractUser
模型派生的自定義用戶模型。 如果我在技術上拼錯了類和子類,我很抱歉,但該技術運行良好。
身份驗證是一種方法,然后重置密碼
from django.contrib.auth import authenticate
user = authenticate(username='username',password='passwd')
try:
if user is not None:
user.set_password('new password')
else:
print('user is not exist')
except:
print("do something here")
與@Ciro 的回答非常相似,但更具體到原始問題(不添加所有身份驗證視圖):
只需添加到urls.py
urlpatterns
:
url('^change-password/$', auth_views.password_change, {'post_change_redirect': 'next_page'}, name='password_change'),
請注意, post_change_redirect
指定了更改密碼后要重定向的 url。
然后,只需添加到您的模板中:
<a href="{% url 'password_change' %}">Change Password</a>
查看.py
views.py
def changepassword(request):
if request.method == "POST":
user_id = request.POST['user_id']
oldpassword = request.POST['oldpassword']
newpassword = request.POST['newpassword']
user = User.objects.get(id=user_id)
if **user.check_password**(oldpassword):
**user.set_password(newpassword)**
user.save()
return redirect("app:login-user")
else:
messages.success(request,"Pervious Password Not Match")
return redirect("app:changepassword")
else:
return render(request,'app/changepassword.html')
url.py
path('changepassword',views.changepassword,name='changepassword'),
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.