You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:15:01