如何在Django用户详情视图中展示用户的所有考试成绩
解决方案:在用户详情页展示关联成绩记录
先确认模型关联配置
首先确保你的Score模型外键设置了反向关联名称(方便后续查询),示例如下:
from django.db import models from django.contrib.auth.models import AbstractUser class User(AbstractUser): # 自定义字段(如果有) pass class Score(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='scores') exam_name = models.CharField(max_length=100) score = models.IntegerField() created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"{self.user.username} - {self.exam_name}: {self.score}"
注:如果没设置
related_name,默认反向查询名为score_set,后续代码需对应调整。
方案1:基于函数的视图(FBV)
通过get_object_or_404获取指定用户,再通过反向关联查询该用户的所有成绩:
from django.shortcuts import get_object_or_404, render from .models import User, Score def user_detail(request, pk): # 获取主键匹配的用户,不存在则返回404 user = get_object_or_404(User, pk=pk) # 反向查询该用户的所有成绩,按考试时间倒序 scores = user.scores.all().order_by('-created_at') # 将用户和成绩数据传给模板 return render(request, 'user_detail.html', {'user': user, 'scores': scores})
对应URL配置(确保主键参数名pk与视图一致):
from django.urls import path from . import views urlpatterns = [ path('users/<int:pk>/', views.user_detail, name='user_detail'), ]
方案2:基于类的视图(CBV)
使用DetailView并重写get_context_data方法,将成绩数据注入上下文:
from django.views.generic.detail import DetailView from .models import User class UserDetailView(DetailView): model = User template_name = 'user_detail.html' context_object_name = 'user' def get_context_data(self, **kwargs): # 获取默认上下文数据 context = super().get_context_data(**kwargs) # 添加当前用户的成绩列表到上下文 context['scores'] = self.object.scores.all().order_by('-created_at') return context
对应URL配置:
path('users/<int:pk>/', views.UserDetailView.as_view(), name='user_detail'),
模板渲染成绩记录
在user_detail.html中展示成绩:
<h1>{{ user.username }} 的个人详情</h1> <h2>考试成绩记录</h2> {% if scores %} <ul> {% for score in scores %} <li>{{ score.exam_name }}:{{ score.score }}分(考试时间:{{ score.created_at|date:"Y-m-d H:i" }})</li> {% endfor %} </ul> {% else %} <p>暂无考试成绩记录</p> {% endif %}
常见错误排查
- 主键不匹配问题:确保URL中的
<int:pk>参数名与视图接收的参数名完全一致(比如视图用user_id的话,URL要改成<int:user_id>) - 反向查询失败:如果没设置
related_name,把代码中的user.scores.all()改成user.score_set.all() - 数据未传递到模板:检查视图中是否正确将
scores变量传入render或上下文
内容的提问来源于stack exchange,提问作者Oscar Anibal
相关产品推荐
相关产品推荐

