¿Cómo permitir que los usuarios cambien sus propias contraseñas en Django?

84

¿Alguien puede indicarme un código donde los usuarios pueden cambiar sus propias contraseñas en Django?

Casco
fuente
15
Si Google nos hizo buscar respuestas en lugar de pensar en ellas, stackoverflow nos hace pedir respuestas en lugar de incluso buscarlas.
Sykora
2
-1 para 'plzsendmetehcodes'. Por cierto, debe aceptar la respuesta correcta a sus preguntas.
Cat Plus Plus
8
Sí, solía usar Google mucho y todavía lo hago. Pero SO es más fácil y rápido, y puede participar en debates y escuchar respuestas alternativas. Siempre que haya personas como Svetlozer Angelov y otros, que estén dispuestos a invertir su tiempo (y ganar puntos) por responder preguntas simples, bueno, para eso es SO.
DOK
7
Django tiene una documentación tan completa y de fácil acceso, que los intentos continuos de replicar toda la documentación en las respuestas SO no pueden agregar ningún valor.
Ben James
3
@Ben James: un buen punto. En realidad, es por eso que en lugar de reescribir la documentación en mis respuestas, solo doy la información básica y el enlace a los documentos.
cethegeek

Respuestas:

159

Django viene con un sistema de autenticación de usuarios. Maneja cuentas de usuario, grupos, permisos y sesiones de usuario basadas en cookies. Este documento explica cómo funcionan las cosas.

Cómo cambiar las contraseñas de Django

Consulte la sección Cambio de contraseñas

  1. Navegación a su proyecto donde se manage.pyencuentra el archivo

  2. $ python manage.py shell

  3. escriba a continuación los scripts:

desde django.contrib.auth.models import User
u = User.objects.get (username__exact = 'john')
u.set_password ('nueva contraseña')
u.save ()

También puede usar el manage.pycomando simple :

manage.py changepassword *username*

Simplemente ingrese la nueva contraseña dos veces.

de la sección Cambiar contraseñas en los documentos.


Si tiene el django.contrib.adminen su INSTALLED_APPS, puede visitar: example.com/path-to-admin/password_change/que tendrá un formulario para confirmar su contraseña anterior e ingresar la nueva contraseña dos veces.

Svetlozar Angelov
fuente
14
No creo que esto ayude a crear páginas para que los usuarios cambien sus propias contraseñas, solo un administrador para hacerlo.
Micah Walter
25

También puede usar la django.contrib.auth.views.password_changevista en su URLconf. Utiliza un formulario y una plantilla predeterminados; el suministro de los suyos es opcional.

Ben James
fuente
4

Es sin necesidad de ir al shell, ingresar passwd y volver a ingresar passwd

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

Usando 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()
Sr. Singh
fuente
2

Este tutorial muestra cómo hacerlo con vistas basadas en funciones:

Ver archivo:

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

Archivo url:

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

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

Y finalmente, la plantilla:

<form method="post">
  {% csrf_token %}
  {{ form }}
  <button type="submit">Save changes</button>
</form>
batata
fuente
1

Una vez que se agrega el patrón de URL como se muestra en la respuesta de Ciro Santilli, una forma rápida de permitir que los usuarios cambien las contraseñas es darles "acceso de personal" para las funciones de administración. Si no los agrega a ningún grupo ni les otorga permisos especiales, aún pueden cambiar su contraseña yendo a la página example.com/admin. El acceso al personal les permite ir a la página incluso si está en blanco; en la esquina superior derecha pueden hacer clic en "cambiar contraseña" y usar la funcionalidad de administración.

ds58
fuente
1

Este es el comando que utilicé, en caso de que tenga problemas en ese lanzamiento 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()"
ji-ruh
fuente
1

Según la documentación , utilice:

from django.contrib.auth.hashers import makepassword

La razón principal para hacer esto es que Django usa contraseñas hash para almacenar en la base de datos.

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

Utilicé esta técnica para el modelo de usuario personalizado que se deriva del AbstractUsermodelo. Lamento si técnicamente escribí mal la clase y la subclase, pero la técnica funcionó bien.

usuario13682212
fuente
0

Muy similar a la respuesta de @ Ciro, pero más específica a la pregunta original (sin agregar todas las vistas de autenticación):

solo agregue urlpatternsen urls.py:

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

Tenga en cuenta que post_change_redirectespecifica la URL para redirigir después de cambiar la contraseña.

Luego, simplemente agregue a su plantilla:

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