我正在尝试从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
变量。有想法吗?
PasswordResetConfirmView
执行内部重定向,该重定向将从URL中删除令牌。因此,您随电子邮件传递的任何查询参数也会被删除。执行此操作的代码行位于dispatch
的PasswordResetConfirmView
函数中,该函数将路径替换为常量: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()}'