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

Django考勤系统:学生个人考勤百分比计算逻辑求助

实现学生考勤百分比查看功能

1. 补全模型字段(可选但实用)

现有Attendance模型缺少考勤日期字段,统计维度会受限,建议添加日期字段来支持更精准的时间段统计:

class Attendance(models.Model):
    id = models.AutoField(primary_key=True)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    status = models.CharField(max_length=15)
    # 自动记录考勤创建日期
    date = models.DateField(auto_now_add=True)

2. 编写学生考勤统计视图

在views.py中新增专属视图,用于学生查询并计算自己的考勤百分比:

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from .models import Student, Attendance, Subject

@login_required
def student_attendance(request):
    # 校验用户角色,替换成你系统中学生对应的user_type值(比如假设是4)
    if request.user.user_type != 4:
        return HttpResponse("无权访问此页面")
    
    # 获取当前登录用户关联的Student实例
    student = Student.objects.get(user=request.user)
    
    # 筛选该学生所有考勤记录
    attendance_records = Attendance.objects.filter(student=student)
    
    # 按科目分组统计考勤数据
    subject_attendances = []
    # 去重获取所有涉及的科目ID
    subject_ids = attendance_records.values_list('subject_id', flat=True).distinct()
    for sub_id in subject_ids:
        subject = Subject.objects.get(id=sub_id)
        total_classes = attendance_records.filter(subject=sub_id).count()
        present_classes = attendance_records.filter(subject=sub_id, status='present').count()
        # 避免除以0报错
        attendance_percent = (present_classes / total_classes) * 100 if total_classes > 0 else 0
        
        subject_attendances.append({
            'subject': subject,
            'total_classes': total_classes,
            'present_classes': present_classes,
            'attendance_percent': round(attendance_percent, 2)
        })
    
    # 计算整体考勤百分比
    total_all = attendance_records.count()
    present_all = attendance_records.filter(status='present').count()
    overall_percent = (present_all / total_all) * 100 if total_all > 0 else 0
    
    context = {
        'subject_attendances': subject_attendances,
        'overall_percent': round(overall_percent, 2)
    }
    return render(request, 'ms/student/attendance_report.html', context)

注意:如果你的考勤状态用的是其他标识(比如'P'代表出勤),需要把status='present'替换成对应的值。

3. 配置URL路由

在项目的urls.py中添加对应路由:

from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path('student/my-attendance/', views.student_attendance, name='student_my_attendance'),
]

4. 编写学生端考勤模板

创建ms/student/attendance_report.html模板,展示统计后的考勤数据:

<!DOCTYPE html>
<html>
<head>
    <title>我的考勤报表</title>
</head>
<body>
    <h2>我的考勤报表</h2>
    <div style="margin: 15px 0;">
        <h3>整体考勤率: {{ overall_percent }}%</h3>
    </div>
    <table border="1" cellpadding="8" cellspacing="0">
        <thead>
            <tr>
                <th>科目</th>
                <th>总课时</th>
                <th>出勤课时</th>
                <th>考勤率</th>
            </tr>
        </thead>
        <tbody>
            {% for item in subject_attendances %}
            <tr>
                <td>{{ item.subject.name }}</td> <!-- 根据你的Subject模型字段调整,比如title就改成item.subject.title -->
                <td>{{ item.total_classes }}</td>
                <td>{{ item.present_classes }}</td>
                <td>{{ item.attendance_percent }}%</td>
            </tr>
            {% empty %}
            <tr>
                <td colspan="4">暂无考勤记录</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

5. 测试验证

  1. 使用staff账号添加若干考勤数据,确保状态标记正确
  2. 用对应学生账号登录系统,访问/student/my-attendance/即可查看个人考勤百分比

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:28:01