96

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

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

4

7 回答 7

102

如果您查看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 模式元组的第三个成员来为视图提供关键字参数。

于 2008-12-23T13:21:11.403 回答
27

强烈推荐这篇文章。

我刚插上它就可以了

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

于 2013-02-14T05:52:07.483 回答
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

于 2008-12-23T18:27:06.573 回答
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
于 2013-04-24T13:20:44.197 回答
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

于 2016-11-26T22:35:09.407 回答
1

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

如果您在登录时遇到问题(这很常见),文档说有三个上下文变量:

  • form: 表示登录表单的 Form 对象。有关 Form 对象的更多信息,请参阅表单文档。
  • next: 成功登录后重定向到的 URL。这也可能包含一个查询字符串。
  • site_name:当前站点的名称,根据 SITE_ID 设置。
于 2008-12-23T12:54:28.010 回答
1

我在 url 和来自管理员的模板中使用了这两行我正在改变我的需要

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")
于 2013-03-04T14:11:37.483 回答