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.
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.
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
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
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:
- añadir a su urlpatterns (r'^/accounts/password/reset/ reset', password_reset)
- ponga su plantilla en '/templates/registration/password_reset_form.html'
- 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:
- 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)
- Quiero un más pequeño url.py
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.
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")
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
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