2012-04-24 32 views
6

Trong trang web của tôi, tôi muốn cho phép quản trị viên đặt lại mật khẩu của bất kỳ người dùng nào.Cách đặt lại mật khẩu người dùng từ giao diện quản trị

Với reset Ý tôi là chính xác những gì quan điểm password_reset làm (dưới contrib.auth): Gửi một liên kết xác nhận đến email mà người dùng.

Làm cách nào tốt nhất để làm điều đó? Có một ứng dụng/đoạn mã đã thực hiện điều đó không?

Edit:

Hãy sử dụng giả sử john là một admin. Những gì tôi muốn là để cho john đặt lại mật khẩu của bất kỳ người dùng nào thông qua giao diện quản trị. Ví dụ: để đặt lại mật khẩu tối đa, anh ấy sẽ chỉ cần chuyển đến người dùng tối đa và nhấp vào bất kỳ liên kết nào để đặt lại mật khẩu của mình.

Trả lời

7

gì cuối cùng tôi đã làm là để thêm một tùy chỉnh ModelAdmin:

from django.contrib.auth.forms import PasswordResetForm 
from django.contrib.auth.admin import UserAdmin 


class CustomUserAdmin(UserAdmin): 
    ... 
    def reset_password(self, request, user_id): 
     if not self.has_change_permission(request): 
      raise PermissionDenied 
     user = get_object_or_404(self.model, pk=user_id) 

     form = PasswordResetForm(data={'email': user.email}) 
     form.is_valid() 

     form.save(email_template_name='my_template.html') 
     return HttpResponseRedirect('..') 

    def get_urls(self): 
     urls = super(UserAdmin, self).get_urls() 

     my_urls = patterns('', 
      (r'^(\d+)/reset-password/$', 
        self.admin_site.admin_view(self.reset_password) 
      ), 
     ) 
     return my_urls + urls 

và tôi cũng phải ghi đè lên change_form.html mẫu, như thế này:

{% extends "admin/change_form.html" %} 
{% load i18n %} 
{% block object-tools %} 
    {% if change %}{% if not is_popup %} 
     <ul class="object-tools"> 
      {# You can also give a name to that pattern and refer to it below using 'url' #} 
      <li><a href="reset-password/" class="historylink">Reset password</a></li> 

      <li><a href="history/" class="historylink">{% trans "History" %}</a></li> 
      {% if has_absolute_url %} 
       <li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink"> 
        {% trans "View on site" %}</a> 
       </li> 
      {% endif%} 
     </ul> 
    {% endif %}{% endif %} 
{% endblock %} 

Kết quả trông như thế này:

Reset Password from admin in Django

Nếu bạn muốn được giải thích chi tiết hơn, tôi blogged about it.

+4

+1, bạn nên đặt phản hồi rất tốt. Nhưng xin vui lòng đặt một bản tóm tắt của nó trong cơ thể của bạn trả lời, nếu không bài viết không được bảo vệ khỏi blog của bạn kết thúc, cộng với nó cảm thấy như whoring giao thông. –

0

Đúng, có một ứng dụng cho điều đó. Kiểm tra ở đây:

https://github.com/bendavis78/django-passreset

+0

Có lẽ tôi đã không giải thích cho bản thân mình. Những gì tôi muốn là để cho mật khẩu thiết lập lại admin của ** người dùng ** khác, không phải để thiết lập lại mật khẩu riêng của họ nếu họ quên chúng. –

+0

Ok. Bạn có ý nghĩa gì khi đặt lại? Bạn chỉ muốn thay đổi mật khẩu thông qua admin hoặc cái gì khác? Cách bạn sẽ cho người dùng biết rằng mật khẩu của anh ấy đã được đặt lại và bạn muốn anh ấy đặt mật khẩu mới như thế nào? – alexarsh

+0

Anh ấy không muốn thay đổi mật khẩu (anh ấy có thể thực hiện điều đó) - anh ấy muốn gọi lại mật khẩu như thể anh ấy là người dùng đó. Incl. email được kích hoạt, v.v. –

2

Ứng dụng passreset chỉ cho thấy quan điểm django qua urls.py, và điều chỉnh các mẫu đăng nhập để hiển thị một "Quên mật khẩu" liên kết.

Chế độ xem và đặt lại mật khẩu được tạo sẵn trong django có nghĩa là tự đặt lại. Tôi đoán biểu mẫu đặt lại có thể được điền sẵn với địa chỉ email của người dùng khác (trong chuỗi truy vấn) nhưng bạn vẫn cần thực hiện các điều chỉnh như thay đổi mẫu email - "Bạn nhận được email này vì bạn đã yêu cầu mật khẩu thiết lập lại cho tài khoản người dùng của bạn" có lẽ không phải những gì bạn muốn:

https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/templates/registration/password_reset_email.html

vì vậy, bạn nên tiếp xúc với các quan điểm tại các URL khác nhau nếu bạn muốn bao gồm tự reset là tốt. Móc chế độ xem django vào urls.py như vậy:

urlpatterns += patterns('django.contrib.auth.views', 
    url(r'^accounts/password/reset/$', 
     'password_reset', 
     name='password-reset'), 
    url(r'^accounts/password/reset/done/$', 
     'password_reset_done', 
     name='password-reset-done'), 
    url(r'^accounts/password/reset/confirm/(?P<uidb36>[-\w]+)/(?P<token>[-\w]+)/$', 
     'password_reset_confirm', 
     name='password-reset-confirm'), 
    url(r'^accounts/password/reset/complete/$', 
     'views.password_reset_complete', 
     name='password-reset-complete') 
) 

và nơi bạn muốn điều chỉnh, chuyển vào ví dụ: bạn mẫu email riêng:

url(r'^/accounts/password/reset/$', 
    'password_reset', 
    {'email_template_name': 'my_templates/password_reset_email.html'} 
    name='password-reset'), 

Các "password_reset" xem có nhiều tham số bạn có thể tinh chỉnh: https://docs.djangoproject.com/en/dev/topics/auth/#module-django.contrib.auth.views ("post_reset_redirect" nói đến cái tâm như nhau cho các mục đích của bạn)

Để hiển thị một liên kết tương ứng bạn hoặc là thay đổi người dùng quản trị (cẩn thận, đã đăng ký - unregister sau đó đăng ký của riêng bạn, subclassed cộng thêm lĩnh vực liên kết) hoặc bản thân các change_form mẫu.

Tôi không biết về một ứng dụng cung cấp tính năng này, vì vậy tôi đã bỏ phiếu cho câu hỏi :-).

Các vấn đề liên quan