Django password_reset/done页面覆盖我的自定义URL [英] Django password_reset/done page overriding my custom URL

查看:64
本文介绍了Django password_reset/done页面覆盖我的自定义URL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用自定义html处理我的注册密码重置区域,因此覆盖了Django的密码重置页面.

I am working on the password reset area of my registration using custom html so am overriding Django's password reset pages.

重设密码初始链接可以正常工作,并重定向到我的自定义URL:

The reset password initial link works fine and redirects to my custom URL:

/account/reset-password/

用户可以输入其电子邮件地址,然后单击提交"以接收密码重置电子邮件.显示的下一页应该是

There a user can enter their email address and click submit to receive a password reset email. The next page shown should be

/account/reset-password/done/

但是当他们单击提交时,我可以从命令行看到:

However when they click submit, I can see from the command line:

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

第二行应该转到

/account/reset-password/done/

不是

/password_reset/done/

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'),

]

settings.py

settings.py

INSTALLED_APPS = [
    'accounts',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

middleware.py

middleware.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)

推荐答案

您可以在PasswordResetView中设置 success_url

You can set your success_url in 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'),

或者您可以直接在 .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'),

这篇关于Django password_reset/done页面覆盖我的自定义URL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆