Як дозволити користувачам змінювати власні паролі в Django?


84

Чи може хтось вказати мені код, де користувачі можуть змінювати власні паролі в Django?


16
Якщо Google змусив нас шукати відповіді замість того, щоб думати про них, stackoverflow змушує нас запитувати відповіді, а не навіть шукати їх.
sykora

2
-1 для 'plzsendmetehcodes'. До речі, ви повинні прийняти правильну відповідь на свої запитання.
Cat Plus Plus

8
Так, раніше я багато використовував Google, і досі. Але SO легше і швидше, і ви можете брати участь в дискусіях і чути альтернативні відповіді. Поки є такі люди, як Світлозер Ангелов та інші, які готові інвестувати свій час (і заробляти бали) для відповіді на прості запитання, ну ось для чого СО.
DOK

7
Django має настільки вичерпну та легкодоступну документацію, що постійні спроби відтворити всю документацію, коли-небудь у відповідях на SO, не можуть додати жодної цінності.
Бен Джеймс

3
@ Бен Джеймс: такий хороший момент. Насправді саме тому, замість того, щоб переписувати документацію у своїх відповідях, я просто даю інформацію про голову та посилання на документи.
cethegeek

Відповіді:


159

Django поставляється з системою автентифікації користувачів. Він обробляє облікові записи користувачів, групи, дозволи та сеанси користувачів на основі файлів cookie. Цей документ пояснює, як все працює.

Як змінити паролі Django

Див. Розділ Зміна паролів

  1. Перехід до вашого проекту, де manage.pyлежить файл

  2. $ python manage.py shell

  3. введіть нижче сценарії:

з 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/який матиме форму для підтвердження вашого старого пароля та введення нового пароля двічі.


14
Я не думаю, що це допомагає створювати сторінки для того, щоб користувачі міняли власні паролі - це просто адміністратор.
Micah Walter

25

Ви також можете просто скористатися django.contrib.auth.views.password_changeподанням у вашому URLconf. Він використовує форму та шаблон за замовчуванням; постачання власного не є обов’язковим.


4

Без необхідності переходити до оболонки введіть 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()


2

Цей підручник показує, як це зробити з поданнями на основі функцій:

Переглянути файл:

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>

1

Після додавання шаблону URL-адреси, як показано у відповіді Циро Сантіллі, швидкий спосіб дозволити користувачам змінювати паролі - це надання їм «доступу персоналу» для функцій адміністратора. Якщо ви не додаєте їх до жодної групи або не надаєте їм спеціальних дозволів, вони все одно можуть змінити свій пароль, перейшовши на сторінку example.com/admin. Доступ персоналу дозволяє їм переходити на сторінку, навіть якщо вона порожня; у верхньому правому куті вони можуть натиснути кнопку "змінити пароль" і скористатися функцією адміністратора.


1

Це команда, яку я використав, на випадок, якщо у вас виникнуть проблеми під час цього кидка 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

Відповідно до документації використовуйте:

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моделі. Мені шкода, якщо я технічно неправильно написав клас і підклас, але техніка спрацювала добре.


0

Дуже схожий на відповідь @ 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.