Czy ktoś może wskazać mi kod, w którym użytkownicy mogą zmieniać swoje własne hasła w Django?
Czy ktoś może wskazać mi kod, w którym użytkownicy mogą zmieniać swoje własne hasła w Django?
Odpowiedzi:
Django zawiera system uwierzytelniania użytkowników. Obsługuje konta użytkowników, grupy, uprawnienia i sesje użytkowników oparte na plikach cookie. Ten dokument wyjaśnia, jak to działa.
Zobacz sekcję Zmiana haseł
Nawigacja do projektu, w którym manage.py
znajduje się plik
$ python manage.py shell
wpisz poniżej skrypty:
z django.contrib.auth.models import User u = User.objects.get (nazwa_użytkownika__exact = 'jan') u.set_password ('nowe hasło') u.save ()
Możesz także użyć prostego manage.py
polecenia:
manage.py changepassword *username*
Wystarczy dwukrotnie wprowadzić nowe hasło.
z sekcji Zmiana haseł w dokumentacji.
Jeśli masz django.contrib.admin
w swoim INSTALLED_APPS
, możesz odwiedzić stronę: example.com/path-to-admin/password_change/
która będzie miała formularz do potwierdzenia starego hasła i dwukrotnego wprowadzenia nowego hasła.
Nie ma potrzeby przechodzenia do powłoki, wpisywania passwd i ponownego wprowadzania passwd
python manage.py changepassword <username>
or
/manage.py changepassword <username>
Korzystanie z powłoki
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()
Ten samouczek pokazuje, jak to zrobić z widokami opartymi na funkcjach:
Zobaczyć plik:
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
})
Plik adresu URL:
from django.conf.urls import url
from myproject.accounts import views
urlpatterns = [
url(r'^password/$', views.change_password, name='change_password'),
]
I na koniec szablon:
<form method="post">
{% csrf_token %}
{{ form }}
<button type="submit">Save changes</button>
</form>
urls.py
:
urlpatterns = [
url(r'^accounts/', include('django.contrib.auth.urls')),
Szablon:
<a href="{% url 'password_change' %}">{% trans "Change password" %}</a>
Udokumentowane pod adresem : https://docs.djangoproject.com/en/1.9/topics/auth/default/#using-the-views
Po dodaniu wzorca adresu URL, jak pokazano w odpowiedzi Ciro Santilli, szybkim sposobem umożliwienia użytkownikom zmiany haseł jest przyznanie im „dostępu personelu” do funkcji administratora. Jeśli nie dodasz ich do żadnej grupy lub nie nadasz im specjalnych uprawnień, nadal będą mogli zmienić swoje hasło, przechodząc do strony example.com/admin. Dostęp dla personelu pozwala im przejść do strony, nawet jeśli jest pusta; w prawym górnym rogu mogą kliknąć „zmień hasło” i skorzystać z funkcji administratora.
To jest polecenie, którego użyłem, na wypadek gdybyś miał problem z tym rzutem 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()"
Zgodnie z dokumentacją użyj:
from django.contrib.auth.hashers import makepassword
Głównym powodem jest to, że Django używa zakodowanych haseł do przechowywania w bazie danych.
password=make_password(password,hasher='default')
obj=User.objects.filter(empid=emp_id).update(username=username,password=password)
Użyłem tej techniki do niestandardowego modelu użytkownika, który pochodzi z AbstractUser
modelu. Przepraszam, jeśli technicznie błędnie wpisałem klasę i podklasę, ale technika działała dobrze.
Bardzo podobny do odpowiedzi @ Ciro, ale bardziej szczegółowy do oryginalnego pytania (bez dodawania wszystkich widoków uwierzytelniania):
wystarczy dodać do urlpatterns
w urls.py
:
url('^change-password/$', auth_views.password_change, {'post_change_redirect': 'next_page'}, name='password_change'),
Zauważ, że post_change_redirect
określa adres URL do przekierowania po zmianie hasła.
Następnie po prostu dodaj do szablonu:
<a href="{% url 'password_change' %}">Change Password</a>