我如何使用我自己的模板使用内置的密码重置/更改视图
例如,我可以在上下文中使用我的模板文件django.contrib.auth.views.password_reset
url '^/accounts/password/reset/$'
指向django.contrib.auth.views.password_reset
,但我认为需要发送更多的上下文详细信息。
我需要确切地知道为每个密码重置和更改视图添加什么上下文。
如果你看看django.contrib.auth.views.password_reset的源代码,你会发现它使用了RequestContext
。 结果是,您可以使用上下文处理器来修改上下文,这可能允许您注入所需的信息。
B列表对上下文处理器有很好的介绍 。
编辑(我似乎已经对实际问题是什么感到困惑):
您会注意到password_reset
接受一个名为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):
检查password_reset以获取更多信息。
…因此,像urls.py一样:
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'}), ... )
将使用关键字参数template_name = 'my_templates/password_reset.html'
为匹配'/accounts/password/reset'
url调用django.contrib.auth.views.password_reset
。
否则,您不需要提供任何上下文,因为password_reset
视图会自行处理。 如果您想查看可用的上下文,则可以触发TemplateSyntax
错误,并查看堆栈跟踪,find名为context
的局部variables的框架。 如果你想修改上下文,那么我上面关于上下文处理器的说法可能是要走的路。
总结:你需要做什么来使用自己的模板? 调用时向视图提供一个template_name
关键字参数。 您可以通过将字典作为URL模式元组的第三个成员包含在视图中,从而为视图提供关键字参数。
强烈推荐这篇文章。
我只是插入它,它的工作
http://garmoncheg.blogspot.com.au/2012/07/django-resetting-passwords-with.html
你只需要包装现有的function,并传递你想要的模板。 例如:
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)
看到这个只是看看内置视图的函数声明:
http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L74
您可以执行以下操作:
- 添加到您的urlpatterns(r'^ / accounts / password / reset / $',password_reset)
- 把你的模板放在'/templates/registration/password_reset_form.html'
- 让您的应用程序在INSTALLED_APPS中的“django.contrib.auth”之前
说明:
当模板被加载时,它们在settings.py中的INSTALLED_APPSvariables中search。 这个顺序是由INSTALLED_APPS中定义的级别决定的,所以既然你的应用程序在'django.contrib.auth'之前加载了你的模板(参考: https : //docs.djangoproject.com/en/dev/ref/templates/api /#django.template.loaders.app_directories.Loader )。
方法的动机:
- 我想要更干燥,不要重复任何视图(由django定义)模板名称(它们已经在django中定义)
- 我想要一个最小的url.py
该文件说,只有一个上下文variables, form
。
如果您在login时遇到了问题(这很常见),那么说明文档中有三个上下文variables:
-
form
:表示login表单的Form对象。 有关Form对象的更多信息,请参阅表单文档。 -
next
:成功login后redirect到的URL。 这也可能包含一个查询string。 -
site_name
:根据SITE_ID设置的当前网站的名称。
我正在使用这两行在URL和pipe理模板,我正在改变我的需要
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")
另一个可能更简单的解决scheme是将您的覆盖模板目录添加到settings.py中的TEMPLATES设置的DIRS条目。 (我认为这个设置在Django 1.8中是新的,在以前的Django版本中可能被称为TEMPLATE_DIRS)。
像这样:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # allow overriding templates from other installed apps 'DIRS': ['my_app/templates'], 'APP_DIRS': True, }]
然后把你的覆盖模板文件在my_app/templates
。 因此,重写的密码重置模板将是my_app/templates/registration/password_reset_form.html