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


92

例如,我可以点url '^/accounts/password/reset/$'django.contrib.auth.views.password_reset我的背景下,模板文件名,但我认为有必要派遣更多的上下文信息。

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


1
给定这个问题的标题,我认为context您找不到合适的东西!
jb。

2
只是为了确认,“上下文”是指额外数据字典,它是url行的第三个参数。又名额外数据或垃圾。抱歉让您感到困惑,任何人都可以编辑问题。
Tom Viner

Answers:


100

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

b-list 对上下文处理器有很好的介绍

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

您会注意到,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'与关键字参数匹配的URL将被调用template_name = 'my_templates/password_reset.html'

否则,您无需提供任何上下文,因为password_reset视图会自行处理。如果要查看可用的上下文,则可以触发TemplateSyntax错误,并在堆栈跟踪中查找具有名为的局部变量的框架context。如果您想修改上下文,那么我上面所说的关于上下文处理器的方法可能就是解决方法。

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


我相信问题是关于将不同的模板与内置视图一起使用-上下文处理器不考虑在内!
jb。

6
任何想法,如何让其registration/password_reset_email.html实际上包含html元素,例如:<div><a>因为这仅发送文本
mabdrabo 2013年

@mabdrabo -看看这篇文章如何获得HTML工作。
gregoltsov 2014年

26

强烈推荐这篇文章。

我刚插上就可以了

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


2
很棒的链接,谢谢。对于那些跟随链接的人-django-registration现在包括默认的auth视图...所以您要做的就是创建上面链接中详细介绍的模板。也-如果您想避免他做的所有手动html表单工作,请使用django-crispy-forms。
dougvk

我必须在工作中管理一些旧的Django代码,但我几乎不了解该框架。那家伙救了我的屁股!很棒的教程
Matt Vukas 2014年

感谢您的链接!我认为这应该是可以接受的答案,因为就像您说的那样,将其插入并起作用。
ihatecache

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


2
这不是最简单的方法。您可以将字典作为URL模式元组的第三部分来传递,或者,如果您确实必须包装该函数,则可以使用:password_reset = functools.partial(password,template_name =“ path / to / my / template” )
艾伦·曼帕

7

您可以执行以下操作:

  1. 添加到您的urlpatterns(r'​​^ / accounts / password / reset / $',password_reset)
  2. 将您的模板放在“ /templates/registration/password_reset_form.html”中
  3. 使您的应用程序位于INSTALLED_APPS中的“ django.contrib.auth”之前

说明:

加载模板后,将在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

2

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


1

文档说只有一个上下文变量form

如果您在登录时遇到麻烦(这很常见),则文档会说明存在三个上下文变量:

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

2
该文档说有一个名为“ template_name”的“可选参数”似乎更相关。
jb。

可选参数是函数的参数,而不是提供给表单的上下文。
S.Lott

嗯,我认为这个问题令人困惑,因为当涉及解决此问题的所有真正问题都是观点的论点时,它谈论的是“上下文” password_reset
jb。

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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.