¿Cómo uso las vistas de cambio / restablecimiento de contraseña integradas con mis propias plantillas?

92

Por ejemplo, yo puedo señalar con el url '^/accounts/password/reset/$'que django.contrib.auth.views.password_resetcon mi plantilla de nombre de archivo en el contexto pero creo necesidad de enviar más información de contexto.

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

Tom Viner
fuente
1
Dado el título de esta pregunta, ¡no creo que contextsea ​​lo correcto que estás buscando!
jb.
2
Solo para confirmar, por "contexto" me refiero al diccionario de datos adicionales que es el tercer argumento de una línea de URL. también conocido como datos adicionales o kwargs . Disculpe las confusiones, edite la pregunta, cualquiera que pueda.
Tom Viner

Respuestas:

100

Si echa un vistazo a las fuentes de django.contrib.auth.views.password_reset , verá que usa 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 (parece que me ha confundido acerca de cuál era la pregunta real):

Notarás que password_resettoma un parámetro con nombre 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):

Consulte password_reset para obtener más información.

... así, 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_resetse llamará 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 password_resetvista se encarga de sí misma. Si desea ver qué contexto tiene disponible, puede activar un TemplateSyntaxerror y buscar en el seguimiento de la pila el marco con una variable local nombrada context. Si desea modificar el contexto, lo que dije anteriormente sobre los procesadores de contexto es probablemente el camino a seguir.

En resumen: ¿qué debe hacer para utilizar su propia plantilla? Proporcione un template_nameargumento de palabra clave a la vista cuando se la llame. Puede proporcionar argumentos de palabras clave a las vistas incluyendo un diccionario como el tercer miembro de una tupla de patrones de URL.

Aaron Maenpaa
fuente
Creo que la pregunta es sobre el uso de diferentes plantillas con vistas integradas: ¡los procesadores de contexto no tienen en cuenta!
jb.
6
alguna idea, cómo hacer que registration/password_reset_email.htmlen realidad contienen elementos HTML como: <div>, <a>porque esto sólo envía el texto
mabdrabo
@mabdrabo: consulte este artículo sobre cómo hacer que HTML funcione.
gregoltsov
26

Recomiendo encarecidamente este artículo.

Solo lo enchufé y funcionó

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

Alex Stewart
fuente
2
gran enlace, gracias. para aquellos que siguen el enlace, django-registration ahora incluye las vistas de autenticación predeterminadas ... así que todo lo que tienes que hacer es crear las plantillas detalladas en el enlace anterior. también: use django-crispy-forms si desea evitar todo el trabajo manual de formularios html que él también hizo.
dougvk
Hay un código heredado de Django que tengo que administrar en el trabajo, pero apenas sé nada sobre el marco. ¡Ese tipo me salvó el culo! Gran tutorial
Matt Vukas
Gracias por el enlace! Creo que esta debería ser la respuesta aceptada ya que, como dijiste, lo conecté y funcionó.
ihatecache
10

Solo necesita ajustar las funciones existentes y pasar la plantilla que desee. 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, solo eche un vistazo a la declaración de función de las vistas integradas:

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

jb.
fuente
2
No es la forma más sencilla de hacer eso. Puede pasar un diccionario como una tercera parte de una tupla de patrones de URL o, si cree que realmente debe ajustar la función, puede usar: password_reset = functools.partial (password, template_name = "path / to / my / template" )
Aaron Maenpaa
7

Puede hacer lo siguiente:

  1. agregar a sus patrones de URL (r '^ / accounts / password / reset / $', password_reset)
  2. ponga su plantilla en '/templates/registration/password_reset_form.html'
  3. haga que su 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 lo dicta 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 del enfoque:

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

Otra solución, quizás más simple, es agregar su directorio de plantillas de reemplazo a la entrada DIRS de la configuración de TEMPLATES en settings.py. (Creo que esta configuración es nueva en Django 1.8. Es posible que se haya 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 coloque sus archivos de plantilla de reemplazo debajo my_app/templates. Entonces, la plantilla de restablecimiento de contraseña anulada seríamy_app/templates/registration/password_reset_form.html

nmgeek
fuente
1

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

Si tiene problemas con el inicio de sesión (que 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 formularios para obtener más información sobre los objetos de formulario.
  • next: La URL a la que se redireccionará después de iniciar sesión correctamente. 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.
S.Lott
fuente
2
La documentación dice que hay un "argumento opcional" llamado "template_name" que parece más relevante.
jb.
El argumento opcional es un argumento de la función, no el contexto proporcionado al formulario.
S.Lott
Mmm- Creo que la pregunta es confusa porque habla de "contexto" cuando en realidad todo lo que es relevante para resolver esto son los argumentos de la password_resetvista.
jb.
1

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")
Azd325
fuente