Jeśli Google zmusił nas do szukania odpowiedzi zamiast o nich myśleć, stackoverflow sprawia, że pytamy o odpowiedzi, a nie nawet ich szukamy.
sykora
2
-1 dla „plzsendmetehcodes”. Przy okazji, powinieneś przyjąć poprawną odpowiedź na swoje pytania.
Cat Plus Plus
8
Tak, często korzystałem z Google i nadal to robię. Ale SO jest łatwiejsze i szybsze, a Ty możesz angażować się w dyskusje i słuchać alternatywnych odpowiedzi. Dopóki są ludzie tacy jak Svetlozer Angelov i inni, którzy są gotowi poświęcić swój czas (i zdobyć punkty) na odpowiedzi na proste pytania, cóż, po to jest SO.
DOK
7
Django ma tak obszerną i łatwo dostępną dokumentację, że ciągłe próby odtworzenia całej dokumentacji w odpowiedziach SO nie mogą w żaden sposób dodać wartości.
Ben James
3
@Ben James: taka dobra uwaga. Właściwie to właśnie dlatego zamiast przepisać dokumentację w moich odpowiedziach, po prostu podaję podstawowe informacje i link do dokumentów.
cethegeek
Odpowiedzi:
161
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.
Jeśli masz django.contrib.adminw 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 sądzę, żeby to pomagało tworzyć strony, na których użytkownicy mogliby zmieniać swoje hasła - wystarczy, że zrobi to administrator.
Micah Walter
25
Możesz także po prostu użyć django.contrib.auth.views.password_changewidoku w swoim URLconf. Używa domyślnego formularza i szablonu; dostarczenie własnego jest opcjonalne.
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()
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()"
Użyłem tej techniki do niestandardowego modelu użytkownika, który pochodzi z AbstractUsermodelu. Przepraszam, jeśli technicznie błędnie wpisałem klasę i podklasę, ale technika działała dobrze.
Odpowiedzi:
Jak zmienić hasła w Django
Zobacz sekcję Zmiana haseł
Nawigacja do projektu, w którym
manage.py
znajduje się plik$ python manage.py shell
wpisz poniżej skrypty:
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 swoimINSTALLED_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.źródło
Możesz także po prostu użyć
django.contrib.auth.views.password_change
widoku w swoim URLconf. Używa domyślnego formularza i szablonu; dostarczenie własnego jest opcjonalne.źródło
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()
źródło
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>
źródło
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
źródło
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.
źródło
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()"
źródło
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.źródło
Bardzo podobny do odpowiedzi @ Ciro, ale bardziej szczegółowy do oryginalnego pytania (bez dodawania wszystkich widoków uwierzytelniania):
wystarczy dodać do
urlpatterns
wurls.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>
źródło