Làm cách nào để cho phép người dùng thay đổi mật khẩu của họ trong Django?


84

Có ai có thể chỉ cho tôi mã nơi người dùng có thể thay đổi mật khẩu của họ trong Django không?


15
Nếu google bắt chúng ta tìm kiếm câu trả lời thay vì nghĩ về chúng, thì stackoverflow khiến chúng ta yêu cầu câu trả lời thay vì thậm chí tìm kiếm chúng.
sykora

2
-1 cho 'plzsendmetehcodes'. BTW, bạn nên chấp nhận câu trả lời chính xác cho câu hỏi của bạn.
Cat Plus Plus

8
Vâng, tôi đã từng sử dụng Google rất nhiều, và bây giờ vẫn vậy. Nhưng SO dễ dàng hơn và nhanh hơn, và bạn có thể tham gia vào các cuộc thảo luận và nghe các câu trả lời thay thế. Miễn là có những người như Svetlozer Angelov và những người khác, những người sẵn sàng đầu tư thời gian (và kiếm điểm) để trả lời những câu hỏi đơn giản, thì đó là điều nên làm.
DOK

7
Django có tài liệu toàn diện và dễ truy cập đến nỗi những nỗ lực không ngừng để sao chép tất cả tài liệu từng có trong câu trả lời SO không thể thêm bất kỳ giá trị nào.
Ben James

3
@Ben James: một điểm tốt như vậy. Thực ra đó là lý do tại sao thay vì viết lại tài liệu trong các câu trả lời của mình, tôi chỉ cung cấp thông tin cơ bản và liên kết đến các tài liệu.
cethegeek

Câu trả lời:


159

Django đi kèm với một hệ thống xác thực người dùng. Nó xử lý tài khoản người dùng, nhóm, quyền và phiên người dùng dựa trên cookie. Tài liệu này giải thích cách mọi thứ hoạt động.

Cách thay đổi mật khẩu Django

Xem mật khẩu Thay đổi phần

  1. Điều hướng đến dự án của bạn nơi manage.pytệp nằm

  2. $ python manage.py shell

  3. gõ các tập lệnh dưới đây:

từ django.contrib.auth.models nhập Người dùng
u = User.objects.get (username__exact = 'john')
u.set_password ('mật khẩu mới')
u.save ()

Bạn cũng có thể sử dụng manage.pylệnh đơn giản :

manage.py changepassword *username*

Chỉ cần nhập mật khẩu mới hai lần.

từ phần Thay đổi mật khẩu trong tài liệu.


Nếu bạn có tài khoản django.contrib.admincủa mình INSTALLED_APPS, bạn có thể truy cập: example.com/path-to-admin/password_change/sẽ có biểu mẫu xác nhận mật khẩu cũ của bạn và nhập mật khẩu mới hai lần.


14
Tôi không nghĩ rằng điều này giúp tạo ra các trang để người dùng thay đổi mật khẩu của chính họ — chỉ cần quản trị viên thực hiện.
Micah Walter

25

Bạn cũng có thể chỉ sử dụng django.contrib.auth.views.password_changechế độ xem trong URLconf của mình. Nó sử dụng một biểu mẫu và mẫu mặc định; cung cấp của riêng bạn là tùy chọn.


4

Nó mà không cần phải đi đến trình bao, nhập mật khẩu và nhập lại mật khẩu

 python manage.py changepassword <username> 
  or
/manage.py changepassword <username>

Sử dụng vỏ

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

Hướng dẫn này chỉ ra cách thực hiện với các chế độ xem dựa trên chức năng:

Xem tài liệu:

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
    })

Tệp url:

from django.conf.urls import url
from myproject.accounts import views

urlpatterns = [
    url(r'^password/$', views.change_password, name='change_password'),
]

Và cuối cùng, mẫu:

<form method="post">
  {% csrf_token %}
  {{ form }}
  <button type="submit">Save changes</button>
</form>

1

Khi mẫu url được thêm vào như trong câu trả lời của Ciro Santilli, một cách nhanh chóng để cho phép người dùng thay đổi mật khẩu là cấp cho họ "quyền truy cập nhân viên" đối với các chức năng quản trị. Nếu bạn không thêm họ vào bất kỳ nhóm nào hoặc cấp cho họ quyền đặc biệt, họ vẫn có thể thay đổi mật khẩu của mình bằng cách truy cập trang example.com/admin. Quyền truy cập của nhân viên cho phép họ truy cập trang ngay cả khi trang đó trống; ở góc trên bên phải, họ có thể nhấp vào "thay đổi mật khẩu" và sử dụng quyền quản trị viên.


1

Đây là lệnh tôi đã sử dụng, đề phòng trường hợp bạn gặp sự cố trong lần ném đó 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

Theo tài liệu , sử dụng:

from django.contrib.auth.hashers import makepassword

Lý do chính để làm điều này là Django sử dụng mật khẩu băm để lưu trữ trong cơ sở dữ liệu.

password=make_password(password,hasher='default')
obj=User.objects.filter(empid=emp_id).update(username=username,password=password)

Tôi đã sử dụng kỹ thuật này cho mô hình người dùng tùy chỉnh có nguồn gốc từ AbstractUsermô hình. Tôi xin lỗi nếu tôi viết sai kỹ thuật cho lớp và lớp con, nhưng kỹ thuật này hoạt động tốt.


0

Rất giống với câu trả lời của @ Ciro, nhưng cụ thể hơn cho câu hỏi ban đầu (mà không thêm tất cả các chế độ xem xác thực):

chỉ cần thêm urlpatternsvào urls.py:

url('^change-password/$', auth_views.password_change, {'post_change_redirect': 'next_page'}, name='password_change'),

Lưu ý rằng post_change_redirectchỉ định url để chuyển hướng sau khi mật khẩu được thay đổi.

Sau đó, chỉ cần thêm vào mẫu của bạn:

<a href="{% url 'password_change' %}">Change Password</a>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.