Как разрешить пользователям менять свои пароли в Django?

84

Может ли кто-нибудь указать мне код, в котором пользователи могут изменять свои пароли в Django?

Халк
источник
17
Если Google заставил нас искать ответы вместо того, чтобы думать о них, stackoverflow заставляет нас запрашивать ответы, а не даже искать их.
sykora
2
-1 для 'plzsendmetehcodes'. Кстати, вы должны принять правильный ответ на свои вопросы.
Cat Plus Plus,
8
Да, я много пользовался Google и до сих пор использую. Но так проще и быстрее, и вы можете участвовать в обсуждениях и слышать альтернативные ответы. Пока есть такие люди, как Светлозер Ангелов и другие, которые готовы вкладывать свое время (и зарабатывать баллы), отвечая на простые вопросы, ну, вот для чего существует SO.
DOK
7
Django имеет настолько исчерпывающую и легкодоступную документацию, что постоянные попытки воспроизвести всю документацию, когда-либо содержащуюся в ответах SO, не могут добавить никакой ценности.
Бен Джеймс
3
@ Бен Джеймс: такой хороший момент. Собственно, поэтому вместо того, чтобы переписывать документацию в своих ответах, я просто даю базовую информацию и ссылаюсь на документацию.
cethegeek

Ответы:

161

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

Светлозар Ангелов
источник
15
Я не думаю, что это помогает создавать страницы, на которых пользователи могут изменять свои собственные пароли - просто администратор делает это.
Мика Уолтер
25

Вы также можете просто использовать django.contrib.auth.views.password_changeпредставление в своем URLconf. Он использует форму и шаблон по умолчанию; поставлять свои собственные необязательно.

Бен Джеймс
источник
4

Его без необходимости идти в оболочку, введите пароль и повторно введите пароль

 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()
Г-н Сингх
источник
3

В этом руководстве показано, как это сделать с помощью представлений на основе функций:

Посмотреть файл:

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. Доступ персонала позволяет им переходить на страницу, даже если она пуста; в правом верхнем углу они могут нажать «сменить пароль» и использовать функции администратора.

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

пользователь13682212
источник
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>
Пабло Герреро
источник