2012-04-24 102 views
6

在我的網站中,我想讓管理員重置任何用戶的密碼。如何從管理界面重置用戶密碼

隨着重置我的意思正是password_reset視圖不(下contrib.auth):發送確認鏈接到該用戶的電子郵件。

這樣做的最好方法是什麼?是否有一個已經應用/片段,這樣做?

編輯:

讓我們假設用戶約翰是管理員。我想要的是讓約翰通過管理界面重置任何用戶的密碼。例如,要重置密碼,他只會轉到用戶,然後單擊任何鏈接重置其密碼。

回答

7

我最後做的是添加自定義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 

,我也不得不重寫change_form.html模板,像這樣:

{% 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 %} 

結果看起來是這樣的:

Reset Password from admin in Django

如果你想更詳細的解釋,我blogged about it

+4

+1,這是很好的你把反饋。但是請將它的摘要放在答案的正文中,否則該帖子不會受到您的博客文章的保護,並且感覺就像流量嫖娼。 – 2012-05-15 08:07:10

0

是的,這是一個應用程序。查看此處:

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

+0

也許我沒有解釋我自己。我想要的是讓管理員重置其他**用戶的密碼,而不是在他們忘記密碼時重置自己的密碼。 – 2012-04-24 21:03:26

+0

好的。重置是什麼意思?你只是想通過管理員或其他方式更改密碼?您如何讓用戶知道他的密碼已重置,您希望他如何設置新密碼? – alexarsh 2012-04-25 08:44:13

+0

他不想更改密碼(他可以這樣做) - 他想調用密碼重置,就好像他是該用戶一樣。含。觸發電子郵件等。 – 2012-04-25 09:19:26

2

的passreset應用程序只是通過urls.py暴露Django的看法,並調整登錄模板,以顯示「忘記密碼」鏈接。

內置的django密碼重置視圖和模板是爲了自我重置。我猜想重置表單可能會預先填入不同用戶的電子郵件地址(在查詢字符串中),但仍需要進行調整,例如更改電子郵件模板 - 「您收到此電子郵件是因爲您請求了密碼重置您的用戶帳戶」可能不是你想要什麼:

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

因此,如果您要包括自我復位,以及你應該暴露在不同的URL的意見。 鉤Django的意見納入urls.py像這樣:

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

,並要做出調整,例如在傳遞您自己的電子郵件模板:

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

的「password_reset」視圖有多個參數,你可以調整: https://docs.djangoproject.com/en/dev/topics/auth/#module-django.contrib.auth.views (「post_reset_redirect」想到的另外一個適合您的需要)

要顯示相應的鏈路您可以更改用戶管理員(注意,已經註冊 - 取消註冊,然後註冊您自己的子類別和附加鏈接字段)或change_form模板本身。

我不知道提供這個開箱即用的應用程序,所以我提出了問題:-)。