How to allow users to change their own passwords in Django?

Question:

Can any one point me to code where users can change their own passwords in Django?

Asked By: Hulk

||

Answers:

Django comes with a user
authentication system. It handles user
accounts, groups, permissions and
cookie-based user sessions. This
document explains how things work.

How to change Django passwords

See the Changing passwords section

  1. Navigation to your project where manage.py file lies

  2. $ python manage.py shell

  3. type below scripts :

from django.contrib.auth.models import User
u = User.objects.get(username__exact='john')
u.set_password('new password')
u.save()

You can also use the simple manage.py command:

manage.py changepassword *username*

Just enter the new password twice.

from the Changing passwords section in the docs.


If you have the django.contrib.admin in your INSTALLED_APPS, you can visit: example.com/path-to-admin/password_change/ which will have a form to confirm your old password and enter the new password twice.

Answered By: Svetlozar Angelov

You can also just use the django.contrib.auth.views.password_change view in your URLconf. It uses a default form and template; supplying your own is optional.

Answered By: Ben James

urls.py:

urlpatterns = [
    url(r'^accounts/', include('django.contrib.auth.urls')),

Template:

<a href="{% url 'password_change' %}">{% trans "Change password" %}</a>

Documented at: https://docs.djangoproject.com/en/1.9/topics/auth/default/#using-the-views

Very similar to @Ciro’s answer, but more specific to the original question (without adding all the authentication views):

just add to urlpatterns in urls.py:

url('^change-password/$', auth_views.password_change, {'post_change_redirect': 'next_page'}, name='password_change'),

Note that post_change_redirect specifies the url to redirect after the password is changed.

Then, just add to your template:

<a href="{% url 'password_change' %}">Change Password</a>
Answered By: Pablo Guerrero

Once the url pattern is added as shown in Ciro Santilli’s answer, a quick way to allow users to change passwords is to give them “staff access” for the admin functions. If you don’t add them to any groups or give them special permissions, they can still change their password by going to the example.com/admin page. The staff access lets them go to the page even if it is blank; in the upper right corner they can click “change password” and use the admin funtionality.

Answered By: ds58

This is the command i used, just in case you are having problem in that throw 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()"
Answered By: ji-ruh

Its without need to go to shell enter passwd and reenter passwd

 python manage.py changepassword <username> 
  or
/manage.py changepassword <username>

Using shell

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()
Answered By: Mr Singh

This tutorial shows how to do it with function based views:

View file:

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
    })

Url file:

from django.conf.urls import url
from myproject.accounts import views

urlpatterns = [
    url(r'^password/$', views.change_password, name='change_password'),
]

And finally, the template:

<form method="post">
  {% csrf_token %}
  {{ form }}
  <button type="submit">Save changes</button>
</form>
Answered By: yam

Per the documentation, use:

from django.contrib.auth.hashers import makepassword

The main reason to do this is that Django uses hashed passwords to store in the database.

password=make_password(password,hasher='default')
obj=User.objects.filter(empid=emp_id).update(username=username,password=password)

I used this technique for the custom user model which is derived from the AbstractUser model. I am sorry if I technically misspelled the class and subclass, but the technique worked well.

Answered By: avsaditya

Authentication is the one way and after that reset the password

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")
Answered By: Krunal Akbari

view.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'),
Answered By: vikas pandey
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.