如何从Django的PasswordResetConfirmView中获取GET参数origin_page
解决Django PasswordResetConfirmView无法获取GET参数的问题
我来帮你分析问题根源,以及对应的解决办法:
问题核心
你当前在get方法里直接赋值self.extra_context的方式,不符合Django类视图的上下文生成逻辑。PasswordResetConfirmView的父类会通过get_context_data方法统一构建模板上下文,你提前设置的extra_context可能被父类逻辑覆盖,或者没有被正确合并到最终的上下文字典中。
另外,建议先做个小验证:在get方法里添加print(self.request.GET),看看控制台输出里是否真的包含origin_page参数——确认参数确实被传递到了请求里。
正确解决方案
1. 重写get_context_data方法传递参数
这是Django类视图添加额外上下文的标准做法,能确保参数被正确注入模板:
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_context_data(self, **kwargs): # 先获取父类生成的基础上下文 context = super().get_context_data(**kwargs) # 把origin_page参数加入上下文,设置默认值避免模板报错 context['origin_page'] = self.request.GET.get('origin_page', '') return context
修改后,你就能在commons/password_reset_confirm.html模板里直接使用{{ origin_page }}调用这个参数了。
2. 确保重置链接正确携带origin_page参数(若未处理)
如果你的重置链接是从特定页面发起的,需要在生成链接时主动附加origin_page参数。可以通过重写PasswordResetView的get_reset_url方法实现:
class PasswordResetView(auth_views.PasswordResetView): def get_reset_url(self, user): # 获取父类生成的基础重置链接 base_url = super().get_reset_url(user) # 获取发起重置请求时的origin_page参数 origin_page = self.request.GET.get('origin_page', '/') # 拼接参数到链接末尾 if '?' in base_url: return f"{base_url}&origin_page={origin_page}" else: return f"{base_url}?origin_page={origin_page}"
记得在urls.py里把默认的password_reset视图替换成你自定义的这个类。
3. 调试排查(如果问题依旧)
如果还是拿不到参数,建议在视图里加调试代码定位问题:
def get_context_data(self, **kwargs): print("当前请求GET参数:", self.request.GET) # 查看参数是否传递过来 context = super().get_context_data(**kwargs) context['origin_page'] = self.request.GET.get('origin_page', '') print("最终模板上下文:", context) # 确认参数是否被加入上下文 return context
通过控制台输出,你可以快速判断是参数没传过来,还是上下文设置环节出了问题。
内容的提问来源于stack exchange,提问作者E-Kami
相关产品推荐
相关产品推荐

