Django中redirect跳转未传递关键字参数问题求助
Django跨App重定向参数传递失败问题解决
问题描述
从一个App的视图重定向到另一个App的视图时,视图可正常访问,但无法传递参数,尝试位置参数和关键字参数均无效。
相关代码
登录视图代码:
if request.method == 'POST': username = request.POST['username'] pass1 = request.POST['pass1'] user = authenticate(username=username, password=pass1) if user is not None: login(request, user) print(user.username, type(user.username), file=sys.stderr) return redirect(reverse('homepage'), user.username) else: messages.error(request, "Bad Credentials!") return redirect('index')
目标视图代码:
@login_required() def homepage(request, username=None): print(username, file=sys.stderr) try: user = userAttribute.objects.get(username=username) except userAttribute.DoesNotExist: return redirect("index")
日志信息
[14/Feb/2024 18:15:18] "GET /signin HTTP/1.1" 200 824 Kane <class 'str'> [14/Feb/2024 18:15:23] "POST /signin HTTP/1.1" 302 0 None
问题原因
错误在于**redirect和reverse的用法搭配错误**:redirect的第二个参数是用于设置HTTP状态码的,并非URL路径参数。正确的做法是将参数传递给reverse函数,由它生成带参数的完整URL后再传给redirect。
同时需确保目标视图对应的URL路由已正确定义参数占位符,示例:
# 目标App的urls.py path('homepage/<str:username>/', views.homepage, name='homepage')
修复方案
方案1:修正重定向代码
将重定向代码修改为以下两种方式之一:
方式1:使用位置参数args
return redirect(reverse('homepage', args=[user.username]))
方式2:使用关键字参数kwargs
return redirect(reverse('homepage', kwargs={'username': user.username}))
方案2:优化实现(无需传递参数)
由于已通过login(request, user)完成用户登录,目标视图可直接通过request.user获取当前登录用户信息,无需通过URL传递参数,更安全且代码更简洁:
修改目标视图:
@login_required() def homepage(request): try: user = userAttribute.objects.get(username=request.user.username) except userAttribute.DoesNotExist: return redirect("index")
对应的URL路由简化为:
path('homepage/', views.homepage, name='homepage')
此时重定向代码只需写:
return redirect('homepage')
内容的提问来源于stack exchange,提问作者Caden The Yak
相关产品推荐
相关产品推荐

