从PasswordResetConfirmView恢复GET参数

问题描述 投票:0回答:1

我正在尝试从Django模板视图GET中恢复django.contrib.auth.PasswordResetConfirmView参数。基本上,当用户单击其密码重置链接(例如http://127.0.0.1:8000/commons/reset/MQ/4t8-210d1909d621e8b4c68e/?origin_page=/mypage/)时,我希望能够检索origin_page=/mypage/参数。到目前为止,我的url.py看起来像这样:

from django.urls import path
from . import views

app_name = 'commons'
urlpatterns = [
    path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
]

还有我的views.py这样:

from django.contrib.auth import views as auth_views

class PasswordResetConfirmView(auth_views.PasswordResetConfirmView):
    template_name = 'commons/password_reset_confirm.html'
    success_url = '/commons/reset/done/'

    def get(self, request, *args, **kwargs):
        self.extra_context = {
            'origin_page': request.GET.get('origin_page')
        }
        return super().get(request, *args, **kwargs)

如您所见,我正在尝试用origin_page获取我的'origin_page': request.GET.get('origin_page'),但是它不起作用,我得到了None值。我什至用调试器检查了类/方法中的每个对象,但似乎没有一个包含我的origin_page变量。有想法吗?

python django django-2.0
1个回答
0
投票

PasswordResetConfirmView执行内部重定向,该重定向将从URL中删除令牌。因此,您随电子邮件传递的任何查询参数也会被删除。执行此操作的代码行位于dispatchPasswordResetConfirmView函数中,该函数将路径替换为常量:https://github.com/django/django/blob/master/django/contrib/auth/views.py#L280

redirect_url = self.request.path.replace(token, self.reset_url_token)

因此您有一个正确的想法,您需要对PasswordResetConfirmView进行子类化,但是我相信您需要更改dispatch函数,该函数大体相同,除了将原始查询参数添加回redirect_url

# tack on whatever query params came with the email link
redirect_url = f'{redirect_url}?{self.request.GET.urlencode()}'
© www.soinside.com 2019 - 2024. All rights reserved.