Django登录认证后如何跳转回触发登录的用户详情页?
问题解决
问题根源
你的代码存在三处影响功能的问题:
- 跳转登录页的URL缺少
?分隔符,next参数不会被识别为查询参数 - 直接拼接
self.get_object()到URL中,取到的是模型实例的默认字符串输出,而非对应页面需要的用户ID post方法最后调用self.get时多传了self参数,运行时会触发参数不匹配错误
修正方案1:快速修复原有写法
直接修改post方法逻辑即可:
def post(self, request, *args, **kwargs): if request.user.is_authenticated: new_comment = Review(content=request.POST.get('content'), rating=request.POST.get('rate'), profile=self.get_object(), user = self.request.user) else: # 补充?分隔符,取实例主键拼接正确的next路径 return redirect(f'/accounts/login/?next=/userprofile/{self.get_object().pk}/') new_comment.save() # 移除多余的self参数 return self.get(request, *args, **kwargs)
修正方案2:更规范的Django写法(推荐)
使用Django内置工具拼接路径,避免硬编码路由,降低后续维护成本:
首先导入依赖:
from django.contrib.auth import redirect_to_login from django.urls import reverse
修改对应逻辑:
def post(self, request, *args, **kwargs): if request.user.is_authenticated: new_comment = Review( content=request.POST.get('content'), rating=request.POST.get('rate'), profile=self.get_object(), user=self.request.user ) else: # 根据路由name生成对应详情页地址,redirect_to_login自动拼接next参数 profile_url = reverse('userprofile', args=[self.get_object().pk]) return redirect_to_login(next=profile_url, login_url='/accounts/login/') new_comment.save() return self.get(request, *args, **kwargs)
注意:reverse方法的第一个参数需要替换为你项目中userprofile路由对应的name值。
Django自带的登录视图会自动读取next查询参数,用户登录成功后会直接跳转至该参数对应的地址,无需额外修改登录逻辑。
内容的提问来源于stack exchange,提问作者parkson-tano
相关产品推荐
相关产品推荐

