¿Cómo uso la contraseña incorporada para restablecer / cambiar las vistas con mis propias plantillas?

Por ejemplo, puedo señalar la url '^/accounts/password/reset/$' a django.contrib.auth.views.password_reset con el nombre de archivo de mi plantilla en el contexto, pero creo que debo enviar más detalles del contexto.

Necesito saber exactamente qué contexto agregar para cada restablecimiento de contraseña y cambio de vistas.

Si echa un vistazo a las fonts de django.contrib.auth.views.password_reset verá que utiliza RequestContext . El resultado es que puede usar procesadores de contexto para modificar el contexto, lo que puede permitirle inyectar la información que necesita.

La lista b tiene una buena introducción a los procesadores de contexto .

Editar (me parece haber estado confundido acerca de cuál era la pregunta real):

Notarás que password_reset toma un parámetro llamado template_name :

 def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html', email_template_name='registration/password_reset_email.html', password_reset_form=PasswordResetForm, token_generator=default_token_generator, post_reset_redirect=None): 

Compruebe password_reset para más información.

… asi, con un urls.py como:

 from django.conf.urls.defaults import * from django.contrib.auth.views import password_reset urlpatterns = patterns('', (r'^/accounts/password/reset/$', password_reset, {'template_name': 'my_templates/password_reset.html'}), ... ) 

django.contrib.auth.views.password_reset a django.contrib.auth.views.password_reset para las URL que coincidan '/accounts/password/reset' con el argumento de palabra clave template_name = 'my_templates/password_reset.html' .

De lo contrario, no es necesario que proporcione ningún contexto, ya que la vista password_reset se ocupa de sí misma. Si desea ver qué contexto tiene disponible, puede desencadenar un error de TemplateSyntax y mirar a través del seguimiento de la stack para encontrar el marco con una variable local llamada context . Si desea modificar el contexto, entonces lo que dije anteriormente sobre los procesadores de contexto es probablemente el camino a seguir.

En resumen: ¿qué necesita hacer para usar su propia plantilla? Proporcione un argumento de palabra clave template_name a la vista cuando se llame. Puede proporcionar argumentos de palabras clave a las vistas al incluir un diccionario como el tercer miembro de una tupla de patrón de URL.

Recomiendo encarecidamente este artículo.

Acabo de enchufarlo y funcionó.

http://garmoncheg.blogspot.com.au/2012/07/django-resetting-passwords-with.html

Solo necesita envolver las funciones existentes y pasar la plantilla que desea. Por ejemplo:

 from django.contrib.auth.views import password_reset def my_password_reset(request, template_name='path/to/my/template'): return password_reset(request, template_name) 

Para ver esto, simplemente eche un vistazo a la statement de funciones de las vistas incorporadas:

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L74

Puedes hacer lo siguiente:

  1. agregue a sus urlpatterns (r ‘^ / accounts / password / reset / $’, password_reset)
  2. ponga su plantilla en ‘/templates/registration/password_reset_form.html’
  3. haz que tu aplicación aparezca antes de ‘django.contrib.auth’ en INSTALLED_APPS

Explicación:

Cuando se cargan las plantillas, se buscan en su variable INSTALLED_APPS en settings.py. El orden viene dictado por el rango de la definición en INSTALLED_APPS, por lo que, dado que su aplicación viene antes que ‘django.contrib.auth’, se cargó su plantilla (referencia: https://docs.djangoproject.com/en/dev/ref/templates/api /#django.template.loaders.app_directories.Loader ).

Motivación de enfoque:

  1. Quiero ser más seco y no repetir para ninguna vista (definida por django) el nombre de la plantilla (ya están definidos en django)
  2. Quiero una url.py más pequeña

La documentación dice que solo hay una variable de contexto, form .

Si tiene problemas con el inicio de sesión (lo cual es común), la documentación dice que hay tres variables de contexto:

  • form : un objeto de formulario que representa el formulario de inicio de sesión. Consulte la documentación de los formularios para obtener más información sobre los objetos de formulario.
  • next : la URL a la que se redirige después de un inicio de sesión exitoso. Esto también puede contener una cadena de consulta.
  • site_name : el nombre del sitio actual, de acuerdo con la configuración de SITE_ID.

Estaba usando estas dos líneas en la url y la plantilla del administrador, lo que estaba cambiando a mi necesidad

 url(r'^change-password/$', 'django.contrib.auth.views.password_change', { 'template_name': 'password_change_form.html'}, name="password-change"), url(r'^change-password-done/$', 'django.contrib.auth.views.password_change_done', { 'template_name': 'password_change_done.html' }, name="password-change-done") 

Otra solución, quizás más sencilla, es agregar el directorio de la plantilla de anulación a la entrada DIRS de la configuración de PLANTILLAS en settings.py. (Creo que esta configuración es nueva en Django 1.8. Puede haberse llamado TEMPLATE_DIRS en versiones anteriores de Django).

Al igual que:

 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # allow overriding templates from other installed apps 'DIRS': ['my_app/templates'], 'APP_DIRS': True, }] 

Luego ponga sus archivos de plantilla de reemplazo en my_app/templates . Por lo tanto, la plantilla de restablecimiento de contraseña anulada sería my_app/templates/registration/password_reset_form.html