2012-04-24 21 views
6

En mi sitio web, quiero dejar a los administradores restablecer la contraseña de cualquier usuario.Cómo restablecer la contraseña del usuario desde la interfaz de administrador

Con restablecer quiero decir exactamente lo que la vista password_reset hace (bajo contrib.auth): Enviar el enlace de confirmación de que el correo electrónico del usuario.

¿Cuál sería la mejor manera de hacerlo? ¿Hay una aplicación/fragmento que hace eso?

Editar: Supongamos que el usuario

Vamos John es un administrador. Lo que quiero es dejar john restablecer la contraseña de cualquier usuario a través de la interfaz de administración. Por ejemplo, para restablecer la contraseña max, simplemente irá al usuario max y haga clic en cualquier enlace para restablecer su contraseña.

Respuesta

7

Lo que finalmente hice fue añadir una costumbre 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 

y también he tenido que anular la plantilla change_form.html, así:

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

El resultado es el siguiente:

Reset Password from admin in Django

Si desea una explicación más detallada, I blogged about it.

+4

+1, es bueno que hagas comentarios. Pero por favor ponga un resumen en el cuerpo de su respuesta, de lo contrario la publicación no está protegida de los extremos de su blog, además de que se siente como prostitución de tráfico. –

0

Sí, hay una aplicación para eso. Comprueba aquí:

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

+0

Quizás no me explique. Lo que quiero es permitir que el administrador restablezca contraseñas de ** otros ** usuarios, no restablecer sus propias contraseñas si se olvidaron de ellas. –

+0

Ok. ¿Qué quieres decir con reiniciar? ¿Solo quiere cambiar la contraseña a través de admin o alguna otra cosa? ¿Cómo le informará al usuario que su contraseña fue restablecida y cómo desea que configure una nueva contraseña? – alexarsh

+0

No quiere cambiar la contraseña (ya puede hacerlo) - quiere invocar el restablecimiento de contraseña como si fuera ese usuario. Incl. correo electrónico activado, etc. –

2

La aplicación passreset simplemente expone los puntos de vista a través de django urls.py, y ajusta la plantilla de conectarse a mostrar un "olvidado mi contraseña".

Las vistas y plantillas integradas de restablecimiento de contraseña de django están pensadas para el reinicio automático. Supongo que el formulario de reinicio podría rellenarse previamente con una dirección de correo electrónico de un usuario diferente (en la cadena de consulta), pero aún tendría que hacer ajustes como cambiar la plantilla de correo electrónico: "Recibió este correo electrónico porque solicitó una contraseña restablecer la cuenta de usuario" probablemente no es lo que quiere:

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

lo tanto, debe exponer los puntos de vista en diferentes direcciones URL si desea incluir la auto-reset también. Enganche las vistas de Django en urls.py así:

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

y en la que desea realizar ajustes, por ejemplo, pasar de su propia plantilla de correo electrónico:

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

El "password_reset" punto de vista tiene más parámetros que se pueden modificar: https://docs.djangoproject.com/en/dev/topics/auth/#module-django.contrib.auth.views ("post_reset_redirect" viene a la mente al otro para sus propósitos)

Para mostrar un enlace correspondiente cambiaría el administrador del usuario (cuidadoso, ya registrado - cancelar el registro y luego registrar el suyo propio, subclasificado más el campo de enlace adicional) o la plantilla change_form en sí.

No tengo conocimiento de una aplicación que ofrezca esta lista, así que cambié la pregunta :-).

Cuestiones relacionadas