【问题标题】:How to reset user password from the admin interface如何从管理界面重置用户密码
【发布时间】:2012-05-04 17:51:18
【问题描述】:

在我的网站中,我想让管理员重置任何用户的密码。

reset 我的意思是 password_reset 视图的作用(在 contrib.auth 下):向该用户电子邮件发送确认链接。

最好的方法是什么?是否已经有一个 app/sn-p 可以做到这一点?

编辑:

假设用户 john 是管理员。我想要的是让 john 通过管理界面重置任何用户的密码。例如,要重置 max 密码,他只需转到 max 用户,然后单击任何链接以重置他的密码。

【问题讨论】:

    标签: django django-admin django-authentication


    【解决方案1】:

    我最后做的是添加一个自定义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 %}
    

    结果如下:

    如果你想要更详细的解释,我blogged about it

    【讨论】:

    • +1,很高兴您提供反馈。但是请把它的摘要放在你的答案正文中,否则帖子不受你博客结束的保护,而且感觉就像流量嫖娼。
    【解决方案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 模板本身。

    我不知道有哪个应用可以开箱即用,所以我赞成这个问题 :-)。

    【讨论】:

      【解决方案3】:

      是的,有一个应用程序可以做到这一点。在这里检查:

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

      【讨论】:

      • 也许我没有解释自己。我想要的是让管理员重置其他用户的密码,而不是在他们忘记密码时重置自己的密码。
      • 好的。你说的重置是什么意思?您只想通过管理员或其他方式更改密码?您将如何让用户知道他的密码已被重置以及您希望他如何设置新密码?
      • 他不想更改密码(他已经可以这样做了)- 他想调用密码重置,就好像他是那个用户一样。包括。触发电子邮件等
      • 好的。比我真的不明白为什么我给的包裹是个坏主意。可以将其更改为从管理界面接受用户。我的意思是,您可以在管理员的用户 change_form.html 中添加“重置密码”链接。该链接将获取用户名(例如,来自原始模板标签)并将其传递给 django-passreset 应用程序。
      • @alexarsh 我终于做到了,但我的意思是您提供的应用程序对我没有任何帮助。所有这些视图(使用重置密码逻辑)已经在contrib.auth 下。在django/contrib/auth/views.py 中查看password_reset
      猜你喜欢
      • 2021-03-22
      • 2019-09-27
      • 1970-01-01
      • 2020-11-28
      • 2018-10-19
      • 1970-01-01
      • 2013-08-26
      • 2017-07-14
      • 2011-09-15
      相关资源
      最近更新 更多