Come consentire agli utenti di modificare le proprie password in Django?


84

Qualcuno può indicarmi un codice in cui gli utenti possono modificare le proprie password in Django?


17
Se Google ci ha fatto cercare risposte invece di pensarci, stackoverflow ci fa chiedere risposte invece di cercarle.
sykora

2
-1 per "plzsendmetehcodes". BTW, dovresti accettare la risposta corretta alle tue domande.
Cat Plus Plus

8
Sì, usavo molto Google e lo faccio ancora. Ma SO è più facile e veloce e puoi partecipare a discussioni e ascoltare risposte alternative. Finché ci sono persone come Svetlozer Angelov e altri, che sono disposti a investire il loro tempo (e guadagnare punti) per rispondere a semplici domande, beh, questo è ciò che è per SO.
DOK

7
Django ha una documentazione così completa e facilmente accessibile, che i continui tentativi di replicare tutta la documentazione nelle risposte SO non possono aggiungere alcun valore.
Ben James,

3
@ Ben James: un ottimo punto. In realtà è per questo che invece di riscrivere la documentazione nelle mie risposte mi limito a fornire le semplici informazioni e il collegamento ai documenti.
cethegeek

Risposte:


161

Django viene fornito con un sistema di autenticazione utente. Gestisce account utente, gruppi, autorizzazioni e sessioni utente basate sui cookie. Questo documento spiega come funzionano le cose.

Come cambiare le password Django

Vedere la sezione Modifica delle password

  1. Navigazione al progetto in cui si manage.pytrova il file

  2. $ python manage.py shell

  3. digitare sotto gli script:

da django.contrib.auth.models importa l'utente
u = User.objects.get (username__exact = 'john')
u.set_password ('nuova password')
salva ()

Puoi anche usare il semplice manage.pycomando:

manage.py changepassword *username*

Basta inserire due volte la nuova password.

dalla sezione Modifica delle password nella documentazione.


Se hai il django.contrib.adminnel tuo INSTALLED_APPS, puoi visitare: example.com/path-to-admin/password_change/che avrà un modulo per confermare la tua vecchia password e inserire due volte la nuova password.


15
Non credo che questo aiuti a creare pagine in cui gli utenti possano modificare le proprie password, solo un amministratore per farlo.
Micah Walter

25

Puoi anche usare la django.contrib.auth.views.password_changevista nel tuo URLconf. Utilizza un modulo e un modello predefiniti; fornire il proprio è facoltativo.


4

Non è necessario andare alla shell, immettere passwd e reinserire passwd

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

Utilizzando 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()

3

Questo tutorial mostra come farlo con le viste basate sulle funzioni:

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

File URL:

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

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

E infine, il modello:

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


1

Una volta aggiunto il pattern URL come mostrato nella risposta di Ciro Santilli, un modo rapido per consentire agli utenti di modificare le password è quello di dare loro "accesso personale" per le funzioni di amministrazione. Se non li aggiungi a nessun gruppo o non concedi loro autorizzazioni speciali, possono comunque modificare la password andando alla pagina example.com/admin. L'accesso del personale consente loro di accedere alla pagina anche se è vuota; nell'angolo in alto a destra possono fare clic su "cambia password" e utilizzare le funzionalità di amministrazione.


1

Questo è il comando che ho usato, nel caso in cui tu abbia problemi in quel lancio 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

Per la documentazione , utilizzare:

from django.contrib.auth.hashers import makepassword

Il motivo principale per farlo è che Django utilizza password con hash per archiviarle nel database.

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

Ho usato questa tecnica per il modello utente personalizzato derivato dal AbstractUsermodello. Mi dispiace se tecnicamente ho scritto male la classe e la sottoclasse, ma la tecnica ha funzionato bene.


0

Molto simile alla risposta di @ Ciro, ma più specifica alla domanda originale (senza aggiungere tutte le viste di autenticazione):

basta aggiungere a urlpatternsin urls.py:

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

Nota che post_change_redirectspecifica l'URL da reindirizzare dopo la modifica della password.

Quindi, aggiungi semplicemente al tuo modello:

<a href="{% url 'password_change' %}">Change Password</a>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.