【问题标题】:How to overwrite password_reset HTML templates如何覆盖 password_reset HTML 模板
【发布时间】:2018-12-16 20:36:35
【问题描述】:

我要做的是覆盖 django 用于 password_reset、password_reset_done、password_reset_confirm 和 password_reset_complete 的默认 HTML 模板。当我向第一个 URL (password_reset) 添加自定义模板时,它实际上运行良好。我可以键入与用户关联的电子邮件并继续进行重置过程,但是当我尝试为 password_reset_done 视图添加自定义模板时,password_reset 视图不再起作用并且我收到以下错误:

Reverse for 'password_reset_done' not found. 'password_reset_done' is not a valid view function or pattern name. 

这是我的 urls.py:

from django.conf.urls import url
# imports for views at a gloabl level (aka other django apps)
from . import views
from django.contrib.auth.views import (
    login,
    logout,
    password_reset,
    password_reset_done,
    password_reset_confirm,
    password_reset_complete
)

urlpatterns = [
    url(r'^$', views.home),
    url(r'^login/$', login, {'template_name': 'accounts/login.html'}),
    url(r'^logout/$', logout, {'template_name': 'accounts/logout.html'}),
    url(r'^register/$', views.register, name='register'),
    url(r'^profile/$', views.view_profile, name='view_profile'),
    url(r'^profile/edit$', views.edit_profile, name='edit_profile'),
    url(r'^change-password$', views.change_password, name='change_password'),
    url(r'^reset-password$', password_reset, {'template_name': 'accounts/reset_password.html'}),
    url(r'^reset-password/done/$', password_reset_done, {'template_name': 'accounts/password_reset_done.html'}),
    url(r'^reset-password/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
    password_reset_confirm, {'template_name': 'accounts/password_reset_confirm.html'}),
    url(r'^reset-password/complete/$', password_reset_complete, {'template_name': 'accounts/password_reset_complete.html'})
]

注意:如果我用正确的 name='password_reset_done, name='password_reset_confirm', name='password_reset_complete' 参数替换 password_reset_done 和所有其他人,一切正常,但我坚持使用默认模板。

这是 urls.py 的功能:

urlpatterns = [
    url(r'^$', views.home),
    url(r'^login/$', login, {'template_name': 'accounts/login.html'}),
    url(r'^logout/$', logout, {'template_name': 'accounts/logout.html'}),
    url(r'^register/$', views.register, name='register'),
    url(r'^profile/$', views.view_profile, name='view_profile'),
    url(r'^profile/edit$', views.edit_profile, name='edit_profile'),
    url(r'^change-password$', views.change_password, name='change_password'),
    url(r'^reset-password$', password_reset, {'template_name': 'accounts/reset_password.html'}),
    url(r'^reset-password/done/$', password_reset_done, name='password_reset_done'),
    url(r'^reset-password/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
    password_reset_confirm, name='password_reset_confirm'),
    url(r'^reset-password/complete/$', password_reset_complete, name='password_reset_complete')
]

只有第一个模板可以更改而不会导致任何错误。我对 django 还是比较陌生,我没有在文档中找到任何可以帮助我解决这个问题的内容。

我将在下面留下其他可能重要的代码

来自settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

非常感谢任何见解。

【问题讨论】:

    标签: html django templates


    【解决方案1】:

    您需要为这些 URL 添加名称,就像您为自己的 URL 添加名称一样。例如:

    url(r'^reset-password/done/$', password_reset_done, {'template_name': 'accounts/password_reset_done.html'}, name='password_reset_done'),
    

    【讨论】:

    • 试过这个解决方案,它奏效了。非常感谢您的参与。我一定会选择您的答案为最佳并投赞成票。
    • 我试过了,但对我没有用。 re_path(r'^password_reset/$', auth_views.PasswordResetView.as_view(), {'template_name': "reset_password.html"}, name='reset_password'),
    • 这对我不起作用。该视图按预期工作,但是它使用了已经到位的密码重置模板。也就是说,我们已经覆盖了模板,所以也许我的系统有些微妙的不同。
    【解决方案2】:

    批准的答案对我不起作用。这样做了:

    views.py:

    from django.contrib.auth.views import PasswordResetConfirmView
    # ...
    class ActivateAccountConfirmView(PasswordResetConfirmView):
        template_name = "./registration/account_activate_confirm.html"
    

    urls.py:

     re_path(
            r'^accounts/activate/confirm/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
            ActivateAccountConfirmView.as_view(),
            name='account_activate_confirm'),
    

    上下文:我的应用程序中有密码重置和帐户激活功能。另请注意,这不是原始用户询问的视图,但应该可以使用相同的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-26
      • 2023-03-10
      • 2011-07-08
      • 2014-05-22
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多