我想允许用户在用户注销时重置密码,但忘记密码。
我正在使用django身份验证框架并创建了reset_password和password_reset_done映射器。
问题:虽然我已创建了password_reset_done函数,但我仍然遇到以下错误。我错过了一个导致此错误的步骤吗?我不知道我做错了什么。
我发布了我认为与我尝试做的相关的所有代码。
使用完整的TraceBack进行编辑:
以下是代码:
relative urls.py
from django.conf.urls import url
from . import views
from django.contrib.auth.views import login, logout, password_reset, password_reset_done
urlpatterns = [
url(r'^$', views.vedic_view, name = 'vedic_home_view'),
url(r'^login/$', login, {'template_name' : 'exist/login.html'}, name = 'login'),
url(r'^logout/$', logout, {'template_name' : 'exist/logout.html'}, name = 'logout'),
url(r'^register/$', views.register_view, 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, name = 'reset_password'),
url(r'^reset-password/done/$', password_reset_done, name = 'password_reset_done')
]
主要urls.py
from django.conf.urls import url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^admin/', admin.site.urls),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
from django.conf.urls import include
from django.views.generic import RedirectView
urlpatterns += [
url(r'^exist/', include('exist.urls', namespace = 'exist')),
url(r'^$', RedirectView.as_view(url='/exist/', permanent=True)),
]
答案 0 :(得分:0)
password_reset_done
位于exists
命名空间内。看起来您正在尝试reverse
指定的URL而不在某处包含命名空间参数。我们需要查看完整的回溯以确切了解发生的位置。
由于您使用的是内置auth
视图,因此最简单的修复方法可能是将密码重置处理移至主urls.py
。请注意,在您的回溯中,内置password_reset
视图执行此操作:
post_reset_redirect = reverse('password_reset_done')
此处的默认实现是reverse
到password_reset_done
,没有任何命名空间。将相关网址移至主urls.py
将允许通过reverse
访问它们而不使用命名空间参数,从而使内置视图更快乐。
答案 1 :(得分:0)
我意识到问题所在。
对于内置重置视图,有一个post_reset_redirect
变量,它使用默认实现reverse(password_reset_done)
转到password_reset_done视图。
问题是在我的主urls.py文档中我创建了命名空间变量
namespace = exist
但是我没有覆盖默认的post_reset_redirect
实现
从reverse(password_reset_done)
到reverse(exist:password_reset_done)
。
所以我现在的
url(r'^reset-password/$', password_reset, name = 'reset_password'),
现在应该看起来像
url(r'^reset-password/$', { 'post_reset_redirect': 'exist:password_reset_done'}, password_reset, name = 'reset_password')
答案 2 :(得分:-1)
如我所见,您的主网址中未包含relative.url
。
修改强>
在相对网址
app_name='exists' #with this name you can call in main urls
urlpatterns = [
url(r'^$', views.vedic_view, name = 'vedic_home_view'),
#...
在主网址:
urlpatterns = [
url(r'^exists/', include('exists.urls')),
#...
编辑2
Here'sthe docs on the subject,它通过示例解释得比我好。