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


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

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

Author: Tom Viner, 2008-12-23

7 answers

Si echas un vistazo a las fuentes de django.contrib.auth.vista.password_reset verás que usa RequestContext. El resultado es que puede usar Procesadores de contexto para modificar el contexto 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 he estado confundido acerca de cuál era la pregunta real):

Te darás cuenta de que password_reset toma un nombre 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.

... así, con un urls.py me gusta:

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 se llamará para URLs que coincidan '/accounts/password/reset' con el argumento de la palabra clave template_name = 'my_templates/password_reset.html'.

De lo contrario, no necesita proporcionar ningún contexto, ya que la vista password_reset se encarga de sí misma. Si desea ver qué contexto tiene disponible, puede activar un error TemplateSyntax y mirar a través del seguimiento de la pila para encontrar el marco con una variable local nombrado 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é necesitas hacer para usar tu propia plantilla? Proporcione un argumento de palabra clave template_name a la vista cuando se invoca. Puede proporcionar argumentos de palabras clave a las vistas incluyendo un diccionario como el tercer miembro de una tupla de patrón de URL.

 98
Author: Aaron Maenpaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-23 11:41:28

Recomiendo encarecidamente este artículo.

Acabo de conectarlo y funcionó

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

 26
Author: Alex Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-14 05:52:07

Solo necesita envolver 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 basta con echar un vistazo a la declaración de funciones de las vistas integradas:

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

 10
Author: jb.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-23 18:27:06

Puedes hacer lo siguiente:

  1. añadir a su urlpatterns (r'^/accounts/password/reset/ reset', password_reset)
  2. ponga su plantilla en '/templates/registration/password_reset_form.html'
  3. haz que tu aplicación esté antes que 'django.contrib.auth ' in INSTALLED_APPS

Explicación:

Cuando se cargan las plantillas, se buscan en su variable INSTALLED_APPS en settings.py . El orden está dictado por el rango de la definición en INSTALLED_APPS, por lo que desde su app come before ' django.contrib.auth ' su plantilla fue cargada (referencia: https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.app_directories.Loader).

Motivación del enfoque:

  1. Quiero que sea más seco y no repita para ninguna vista(definida por django) el nombre de la plantilla (ya están definidos en django)
  2. Quiero un más pequeño url.py
 6
Author: Lodato L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-02 13:52:23

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 formularios para obtener más información sobre los objetos de formulario.
  • next: La URL a la que redirigir 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 SITE_ID.
 1
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-23 12:54:28

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")
 1
Author: Azd325,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-04 14:11:37

Otra solución, quizás más simple, es agregar su directorio de 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 haber sido llamado TEMPLATE_DIRS en versiones anteriores de Django.)

Así:

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 anulación en my_app/templates. Así que la plantilla de restablecimiento de contraseña anulada sería my_app/templates/registration/password_reset_form.html

 1
Author: nmgeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-26 22:35:09