Чи може хтось вказати мені код, де користувачі можуть змінювати власні паролі в Django?
Чи може хтось вказати мені код, де користувачі можуть змінювати власні паролі в Django?
Відповіді:
Django поставляється з системою автентифікації користувачів. Він обробляє облікові записи користувачів, групи, дозволи та сеанси користувачів на основі файлів cookie. Цей документ пояснює, як все працює.
Див. Розділ Зміна паролів
Перехід до вашого проекту, де manage.py
лежить файл
$ python manage.py shell
введіть нижче сценарії:
з django.contrib.auth.models імпортувати Користувача u = User.objects.get (username__exact = 'john') u.set_password ('новий пароль') u.save ()
Ви також можете використовувати просту manage.py
команду:
manage.py changepassword *username*
Просто введіть новий пароль двічі.
з розділу Зміна паролів у документації.
Якщо у вас є django.contrib.admin
ваш INSTALLED_APPS
, ви можете відвідати: example.com/path-to-admin/password_change/
який матиме форму для підтвердження вашого старого пароля та введення нового пароля двічі.
Ви також можете просто скористатися django.contrib.auth.views.password_change
поданням у вашому URLconf. Він використовує форму та шаблон за замовчуванням; постачання власного не є обов’язковим.
Без необхідності переходити до оболонки введіть passwd і повторно введіть passwd
python manage.py changepassword <username>
or
/manage.py changepassword <username>
Використання оболонки
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()
urls.py
:
urlpatterns = [
url(r'^accounts/', include('django.contrib.auth.urls')),
Шаблон:
<a href="{% url 'password_change' %}">{% trans "Change password" %}</a>
Документовано за адресою: https://docs.djangoproject.com/en/1.9/topics/auth/default/#using-the-views
Цей підручник показує, як це зробити з поданнями на основі функцій:
Переглянути файл:
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:
from django.conf.urls import url
from myproject.accounts import views
urlpatterns = [
url(r'^password/$', views.change_password, name='change_password'),
]
І нарешті, шаблон:
<form method="post">
{% csrf_token %}
{{ form }}
<button type="submit">Save changes</button>
</form>
Після додавання шаблону URL-адреси, як показано у відповіді Циро Сантіллі, швидкий спосіб дозволити користувачам змінювати паролі - це надання їм «доступу персоналу» для функцій адміністратора. Якщо ви не додаєте їх до жодної групи або не надаєте їм спеціальних дозволів, вони все одно можуть змінити свій пароль, перейшовши на сторінку example.com/admin. Доступ персоналу дозволяє їм переходити на сторінку, навіть якщо вона порожня; у верхньому правому куті вони можуть натиснути кнопку "змінити пароль" і скористатися функцією адміністратора.
Це команда, яку я використав, на випадок, якщо у вас виникнуть проблеми під час цього кидка 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()"
Відповідно до документації використовуйте:
from django.contrib.auth.hashers import makepassword
Основною причиною цього є те, що Django використовує хешовані паролі для зберігання в базі даних.
password=make_password(password,hasher='default')
obj=User.objects.filter(empid=emp_id).update(username=username,password=password)
Я використав цю техніку для користувацької моделі користувача, яка походить від AbstractUser
моделі. Мені шкода, якщо я технічно неправильно написав клас і підклас, але техніка спрацювала добре.
Дуже схожий на відповідь @ Ciro, але більш конкретний до вихідного питання (без додавання всіх подань автентифікації):
просто додати urlpatterns
в urls.py
:
url('^change-password/$', auth_views.password_change, {'post_change_redirect': 'next_page'}, name='password_change'),
Зверніть увагу, що post_change_redirect
вказується URL-адреса для переспрямування після зміни пароля.
Потім просто додайте до свого шаблону:
<a href="{% url 'password_change' %}">Change Password</a>