7

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

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

最好的方法是如何做到这一点?是否已经有一个应用程序/片段可以做到这一点?

编辑:

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

4

3 回答 3

8

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

结果如下所示:

在 Django 中从管理员重置密码

如果您想要更详细的解释,我在博客中对此进行了介绍。

于 2012-05-15T07:50:19.417 回答
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 模板本身。

我不知道提供开箱即用的应用程序,所以我赞成这个问题:-)。

于 2012-04-26T00:57:12.443 回答
0

是的,有一个应用程序。在这里检查:

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

于 2012-04-24T16:42:14.927 回答