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

如何在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 %}

常见错误排查

  1. 主键不匹配问题:确保URL中的<int:pk>参数名与视图接收的参数名完全一致(比如视图用user_id的话,URL要改成<int:user_id>)
  2. 反向查询失败:如果没设置related_name,把代码中的user.scores.all()改成user.score_set.all()
  3. 数据未传递到模板:检查视图中是否正确将scores变量传入render或上下文

内容的提问来源于stack exchange,提问作者Oscar Anibal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:06