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

时间:2008-12-23 12:47:32

标签: python django passwords

例如,我可以在上下文中使用我的模板文件名将url '^/accounts/password/reset/$'指向django.contrib.auth.views.password_reset,但我认为需要发送更多上下文详细信息。

我需要确切知道为每个密码重置和更改视图添加的上下文。

7 个答案:

答案 0 :(得分:98)

如果您查看django.contrib.auth.views.password_reset的来源,您会看到它使用RequestContext。结果是,您可以使用上下文处理器来修改上下文,这可能允许您注入所需的信息。

b-list有一个很好的introduction to context processors

编辑(我似乎对实际问题的看法感到困惑):

您会注意到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'}),
     ...
)
对于匹配django.contrib.auth.views.password_reset且关键字参数为'/accounts/password/reset'的网址,系统会调用{p> template_name = 'my_templates/password_reset.html'

否则,您无需提供任何上下文,因为password_reset视图会自行处理。如果要查看可用的上下文,可以触发TemplateSyntax错误并查看堆栈跟踪,找到具有名为context的局部变量的帧。如果你想修改上下文,那么我上面提到的关于上下文处理器的内容可能就是这样。

总结:使用自己的模板需要做什么?在调用视图时,为视图提供template_name关键字参数。您可以通过将字典包含为URL模式元组的第三个成员来为视图提供关键字参数。

答案 1 :(得分:26)

强烈推荐这篇文章。

我只是将其插入并运行

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

答案 2 :(得分:10)

您只需要包装现有函数并传入所需的模板。例如:

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

答案 3 :(得分:6)

您可以执行以下操作:

  1. 添加到您的urlpatterns(r'​​^ / accounts / password / reset / $',password_reset)
  2. 将您的模板放入'/templates/registration/password_reset_form.html'
  3. 让你的应用程序在INSTALLED_APPS中的'django.contrib.auth'之前出现
  4. 说明:

    加载模板后,会在settings.py中的INSTALLED_APPS变量中搜索它们。 订单由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

答案 4 :(得分:1)

documentation表示只有一个上下文变量form

如果您遇到登录问题(这很常见),documentation表示有三个上下文变量:

  • form:表示登录表单的Form对象。有关表单对象的更多信息,请参阅表单文档。
  • next:成功登录后重定向到的URL。这也可能包含查询字符串。
  • site_name:当前网站的名称,根据SITE_ID设置。

答案 5 :(得分:1)

我在网址中使用了这两行,而管理员使用的是我正在改变我需要的模板

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

答案 6 :(得分:1)

另一种更简单的解决方案是将覆盖模板目录添加到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