Wie können Benutzer ihre eigenen Passwörter in Django ändern?

84

Kann mich jemand auf einen Code verweisen, in dem Benutzer ihre eigenen Passwörter in Django ändern können?

Hulk
quelle
15
Wenn Google uns dazu gebracht hat, nach Antworten zu suchen, anstatt über sie nachzudenken, werden wir durch Stackoverflow nach Antworten gefragt, anstatt sie überhaupt zu suchen.
Sykora
2
-1 für 'plzsendmetehcodes'. Übrigens sollten Sie die richtige Antwort auf Ihre Fragen akzeptieren.
Cat Plus Plus
8
Ja, ich habe Google oft benutzt und tue es immer noch. Aber SO ist einfacher und schneller, und Sie können sich an Diskussionen beteiligen und alternative Antworten hören. Solange es Leute wie Svetlozer Angelov und andere gibt, die bereit sind, ihre Zeit (und Punkte) für die Beantwortung einfacher Fragen zu investieren, ist SO genau dafür.
DOK
7
Django verfügt über eine so umfassende und leicht zugängliche Dokumentation, dass die laufenden Versuche, die gesamte Dokumentation jemals in SO-Antworten zu replizieren, möglicherweise keinen Mehrwert bringen können.
Ben James
3
@ Ben James: so ein guter Punkt. Deshalb gebe ich, anstatt die Dokumentation in meinen Antworten neu zu schreiben, nur die Barebone-Informationen und den Link zu den Dokumenten.
Cethegeek

Antworten:

158

Django wird mit einem Benutzerauthentifizierungssystem geliefert. Es verwaltet Benutzerkonten, Gruppen, Berechtigungen und Cookie-basierte Benutzersitzungen. Dieses Dokument erklärt, wie die Dinge funktionieren.

So ändern Sie Django-Passwörter

Siehe den Abschnitt Ändern von Passwörtern

  1. Navigation zu Ihrem Projekt, in dem sich die manage.pyDatei befindet

  2. $ python manage.py shell

  3. Geben Sie die folgenden Skripte ein:

aus django.contrib.auth.models Benutzer importieren
u = User.objects.get (Benutzername__exact = 'john')
u.set_password ('neues Passwort')
u.save ()

Sie können auch den einfachen manage.pyBefehl verwenden:

manage.py changepassword *username*

Geben Sie einfach zweimal das neue Passwort ein.

aus dem Abschnitt Ändern von Passwörtern in den Dokumenten.


Wenn Sie das django.contrib.adminin Ihrem haben INSTALLED_APPS, können Sie besuchen: example.com/path-to-admin/password_change/welches ein Formular hat, um Ihr altes Passwort zu bestätigen und das neue Passwort zweimal einzugeben.

Svetlozar Angelov
quelle
14
Ich glaube nicht, dass dies dazu beiträgt, Seiten zu erstellen, auf denen Benutzer ihre eigenen Passwörter ändern können - nur ein Administrator, der dies tut.
Micah Walter
25

Sie können auch einfach die django.contrib.auth.views.password_changeAnsicht in Ihrer URLconf verwenden. Es werden ein Standardformular und eine Standardvorlage verwendet. Die Lieferung Ihrer eigenen ist optional.

Ben James
quelle
4

Es ist nicht nötig, zur Shell zu gehen, passwd einzugeben und passwd erneut einzugeben

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

Shell verwenden

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()
Herr Singh
quelle
2

Dieses Tutorial zeigt, wie es mit funktionsbasierten Ansichten gemacht wird:

Datei ansehen:

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-Datei:

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

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

Und schließlich die Vorlage:

<form method="post">
  {% csrf_token %}
  {{ form }}
  <button type="submit">Save changes</button>
</form>
Süßkartoffel
quelle
1

Sobald das URL-Muster hinzugefügt wurde, wie in der Antwort von Ciro Santilli gezeigt, können Benutzer Kennwörter schnell ändern, indem sie ihnen "Mitarbeiterzugriff" für die Verwaltungsfunktionen gewähren. Wenn Sie sie keiner Gruppe hinzufügen oder ihnen spezielle Berechtigungen erteilen, können sie ihr Kennwort dennoch auf der Seite example.com/admin ändern. Über den Mitarbeiterzugriff können sie die Seite aufrufen, auch wenn sie leer ist. In der oberen rechten Ecke können sie auf "Passwort ändern" klicken und die Administratorfunktion verwenden.

ds58
quelle
1

Dies ist der Befehl, den ich verwendet habe, nur für den Fall, dass Sie Probleme mit diesem Wurf haben 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
quelle
1

Verwenden Sie gemäß der Dokumentation :

from django.contrib.auth.hashers import makepassword

Der Hauptgrund dafür ist, dass Django Hash-Passwörter zum Speichern in der Datenbank verwendet.

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

Ich habe diese Technik für das benutzerdefinierte Benutzermodell verwendet, das vom AbstractUserModell abgeleitet ist . Es tut mir leid, wenn ich die Klasse und die Unterklasse technisch falsch geschrieben habe, aber die Technik hat gut funktioniert.

user13682212
quelle
0

Sehr ähnlich der Antwort von @ Ciro, jedoch spezifischer für die ursprüngliche Frage (ohne alle Authentifizierungsansichten hinzuzufügen):

einfach hinzufügen urlpatternsin urls.py:

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

Beachten Sie, dass post_change_redirectdie URL angegeben wird, die nach dem Ändern des Kennworts umgeleitet werden soll.

Dann fügen Sie einfach Ihrer Vorlage hinzu:

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