在我的网站上,我想让管理员重置任何用户的密码。
重置,我的意思是password_reset
视图的确实作用(在 contrib.auth 下):向该用户电子邮件发送确认链接。
这样做最好的方法是什么?是否已有一个app / snippet可以做到这一点?
修改
假设用户 john 是管理员。我想要的是让 john 通过管理界面重置任何用户的密码。例如,要重置 max 密码,他只需转到 max 用户,然后点击任意链接重置密码。
答案 0 :(得分: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 %}
结果如下:
如果您想要更详细的解释,我blogged about it。
答案 1 :(得分:2)
passreset应用程序只是通过urls.py公开django视图,并调整登录模板以显示“忘记我的密码”链接。
内置的django密码重置视图和模板用于自我重置。我想重置表单可以使用不同用户的电子邮件地址预先填充(在查询字符串中),但您仍需要进行调整,例如更改电子邮件模板 - “您因为请求了密码而收到此电子邮件重置您的用户帐户“可能不是您想要的:
因此,如果您想要包含自我重置,则应该在不同的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模板本身。
我没有意识到提供这种开箱即用的应用程序,所以我对这个问题提出了建议: - )。
答案 2 :(得分:0)
是的,有一个应用程序。点击这里: