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
相关产品推荐
相关产品推荐

