0

我正在尝试GET从 Django 模板视图中恢复参数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变量。任何想法?

4

1 回答 1

0

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

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()}'
于 2019-09-27T21:18:52.537 回答