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

Django无法在URL中传递用户id跳转对应个人资料页求助

问题修复方案

根因分析

  • 首页视图返回的是全量Profile查询集,而非当前登录用户的个人Profile实例,导致模板无法读取到正确的用户ID
  • 模板跳转路径和urls.py中定义的路由规则顺序不匹配,路由无法命中触发404
  • 缺少登录状态校验和自身资料访问权限控制,不符合业务要求

修复步骤

1. 修复首页视图(views.py)

给首页视图添加登录校验,同时查询当前登录用户的Profile实例,而非全量数据:

from django.contrib.auth.decorators import login_required

# 加登录装饰器,未登录用户自动跳转登录页
@login_required(login_url='/login/')
def home(request):
    # 取当前登录用户关联的Profile实例,此处假设Profile和User是OneToOne关联,关联名为profile,若自定义关联名请自行替换
    profile = request.user.profile
    return render(request,'bgmiapp/home.html',{'profile':profile})

2. 调整路由/模板路径匹配(二选一即可)

方案A:保留现有路由规则,修改模板路径

现有urls.py中路由为/<int:pk>/profile/,直接修改home.html中的跳转链接,推荐用Django内置的url标签匹配路由名,避免硬编码路径出错:

<a href="{% url 'show_profile_page' pk=profile.id %}">profile</a>

方案B:调整路由匹配你想要的/profile/<pk>格式

修改urls.py中的路由规则:

urlpatterns = [
    # 其他原有路由不变
    path('profile/<int:pk>/',ShowProfilePageView.as_view(),name='show_profile_page')  
]

同步调整模板跳转链接即可:

<a href="{% url 'show_profile_page' pk=profile.id %}">profile</a>

3. 给个人资料页添加权限校验(可选但强烈建议)

避免用户手动输入其他用户ID查看他人资料,给ShowProfilePageView添加登录校验和访问权限控制:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.exceptions import PermissionDenied

class ShowProfilePageView(LoginRequiredMixin, DetailView):
    login_url = '/login/'
    model = Profile
    template_name = 'bgmiapp/user_profilepage.html'

    def get_context_data(self,*args,**kwargs):
        context = super(ShowProfilePageView,self).get_context_data(*args,**kwargs)
        page_user = get_object_or_404(Profile,id=self.kwargs['pk'])
        # 校验访问的是当前登录用户自己的资料
        if page_user.user.id != self.request.user.id:
            raise PermissionDenied("你无权查看他人资料")
        context["page_user"] = page_user
        return context

内容的提问来源于stack exchange,提问作者Rajesh Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 04:15:01