簡體   English   中英

Django如何讓用戶修改自己的密碼?

[英]How to allow users to change their own passwords in Django?

任何人都可以指出我的代碼,用戶可以在 Django 中更改自己的密碼嗎?

Django 帶有一個用戶認證系統。 它處理用戶帳戶、組、權限和基於 cookie 的用戶會話。 本文檔解釋了事情是如何運作的。

如何更改 Django 密碼

請參閱更改密碼部分

  1. 導航到manage.py文件所在的項目

  2. $ python manage.py shell

  3. 鍵入以下腳本:

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_APPSdjango.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM