我正在使用自定义 html 处理我的注册的密码重置区域,因此我覆盖了 Django 的密码重置页面。
重置密码初始链接工作正常并重定向到我的自定义 URL:
/account/reset-password/
Run Code Online (Sandbox Code Playgroud)
用户可以在此处输入他们的电子邮件地址,然后单击“提交”以接收密码重置电子邮件。显示的下一页应该是
/account/reset-password/done/
Run Code Online (Sandbox Code Playgroud)
但是,当他们单击提交时,我可以从命令行看到:
POST /account/reset-password/ HTTP/1.1" 302 0
GET /password_reset/done/ HTTP/1.1" 302 0
GET /account/login/ HTTP/1.1" 200 2237
Run Code Online (Sandbox Code Playgroud)
第二行应该是
/account/reset-password/done/
Run Code Online (Sandbox Code Playgroud)
不是
/password_reset/done/
Run Code Online (Sandbox Code Playgroud)
urls.py
app_name='accounts'
from django.conf.urls import url
from . import views
from django.contrib.auth.views import LoginView, LogoutView, PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView, PasswordResetCompleteView
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^$', views.home, name='home'),
url(r'^login/$', LoginView.as_view(template_name='accounts/login.html'), name='login'),
url(r'^logout/$', LogoutView.as_view(template_name='accounts/logout.html'), name='logout'),
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/$',
PasswordResetView.as_view(template_name='accounts/reset_password.html'),
{'post_reset_redirect': 'accounts:reset_password_done',
'email_template_name': 'accounts/reset_password_email.html'},
name='reset_password'),
url(r'^reset-password/done/$',
PasswordResetDoneView.as_view(template_name='accounts/reset_password_done.html'),
name='reset_password_done'),
url(r'^reset-password/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>,+)/$',
PasswordResetConfirmView.as_view(template_name='accounts/reset_password_confirm.html'),
name='reset_password_confirm'),
url(r'^reset-password/complete/$',
PasswordResetConfirmView.as_view(template_name='accounts/reset_password_complete.html'),
name='reset_password_complete'),
]
Run Code Online (Sandbox Code Playgroud)
设置.py
INSTALLED_APPS = [
'accounts',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Run Code Online (Sandbox Code Playgroud)
中间件.py
import re
from django.conf import settings
from django.urls import reverse
from django.shortcuts import redirect
from django.contrib.auth import logout
EXEMPT_URLS = [re.compile(settings.LOGIN_URL.lstrip('/'))]
if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
EXEMPT_URLS += [re.compile(url) for url in settings.LOGIN_EXEMPT_URLS]
class LoginRequiredMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_view(self, request, view_func, view_args, view_kwargs):
assert hasattr(request, 'user')
path = request.path_info.lstrip('/')
url_is_exempt = any(url.match(path) for url in EXEMPT_URLS)
if path == reverse('accounts:logout').lstrip('/'):
logout(request)
if request.user.is_authenticated and url_is_exempt:
return redirect(settings.LOGIN_REDIRECT_URL)
elif request.user.is_authenticated or url_is_exempt:
return None
if not request.user.is_authenticated and url_is_exempt:
return None
else:
return redirect(settings.LOGIN_URL)
Run Code Online (Sandbox Code Playgroud)
您可以success_url在PasswordResetView中设置您的,
url(r'^reset-password/$',
PasswordResetView.as_view(template_name='accounts/reset_password.html'),
{
'email_template_name': 'accounts/reset_password_email.html',
'success_url' : reverse_lazy('accounts:reset_password_done')
},
name='reset_password'),
Run Code Online (Sandbox Code Playgroud)
或者你可以直接success_url传入.as_view()
url(r'^reset-password/$',
PasswordResetView.as_view(template_name='accounts/reset_password.html',
email_template_name = 'accounts/reset_password_email.html',
success_url = reverse_lazy('accounts:reset_password_done')) ,
name='reset_password'),
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4058 次 |
| 最近记录: |