如何在Django中允许用户更改自己的密码?


84

谁能指出我可以在Django中更改用户密码的代码?


15
如果google让我们搜索答案而不是思考它们,那么stackoverflow会让我们要求答案而不是搜索它们。
sykora

2
-1表示“ plzsendmetehcodes”。顺便说一句,您应该接受对问题的正确答案。
Cat Plus Plus 2009年

8
是的,我过去经常使用Google,现在仍会使用。但是SO更容易,更快捷,您可以参与讨论并听取其他答案。只要有像Svetlozer Angelov等人,他们愿意花时间(并赚取积分)来回答简单的问题,那就是SO的目的。
DOK,2009年

7
Django具有如此全面且易于访问的文档,以至于正在进行的以SO答案复制所有文档的尝试都不可能增加任何价值。
本詹姆斯

3
@本詹姆斯:好点。实际上,这就是为什么与其在我的答案中重写文档,不如说是我提供了准系统信息并链接到文档。
cethegeek

Answers:


159

Django随附了一个用户身份验证系统。它处理用户帐户,组,权限和基于cookie的用户会话。本文档说明了工作原理。

如何更改Django密码

请参阅更改密码部分

  1. 导航到manage.py文件所在的项目

  2. $ python manage.py shell

  3. 在脚本下面输入:

从django.contrib.auth.models导入用户
u = User.objects.get(username__exact ='john')
u.set_password('新密码')
u.save()

您还可以使用简单的manage.py命令:

manage.py changepassword *username*

只需输入两次新密码即可。

从文档的更改密码部分中。


如果你有django.contrib.admin你的INSTALLED_APPS,你可以访问:example.com/path-to-admin/password_change/这将有一个表格,以确认您的旧密码,然后输入两次新密码。


14
我认为这不会帮助用户创建页面来更改自己的密码,而只是管理员可以这样做。
米卡·沃尔特

25

您也可以只django.contrib.auth.views.password_change在URLconf中使用视图。它使用默认的表单和模板;自己提供是可选的。


4

它无需进入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()


2

本教程展示了如何使用基于函数的视图来实现:

查看文件:

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>

1

如Ciro Santilli的回答所示,一旦添加了url模式,允许用户更改密码的一种快速方法就是为他们提供管理员功能的“人员访问权”。如果您不将其添加到任何组中或未赋予其特殊权限,它们仍然可以通过转到example.com/admin页面来更改其密码。员工访问权限使他们可以转到页面,即使该页面为空白;在右上角,他们可以单击“更改密码”并使用管理功能。


1

这是我使用的命令,以防万一您在该投掷中遇到问题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()"

1

根据文档,使用:

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模型派生的自定义用户模型。如果我在技术上拼写了该类和子类,我感到很抱歉,但是该技术效果很好。


0

与@Ciro的答案非常相似,但更特定于原始问题(不添加所有身份验证视图):

只需添加到urlpatternsurls.py

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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.