我如何使用我自己的模板使用内置的密码重置/更改视图

例如,我可以在上下文中使用我的模板文件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

您可以执行以下操作:

  1. 添加到您的urlpatterns(r'​​^ / accounts / password / reset / $',password_reset)
  2. 把你的模板放在'/templates/registration/password_reset_form.html'
  3. 让您的应用程序在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 )。

方法的动机:

  1. 我想要更干燥,不要重复任何视图(由django定义)模板名称(它们已经在django中定义)
  2. 我想要一个最小的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