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. 测试验证
- 使用staff账号添加若干考勤数据,确保状态标记正确
- 用对应学生账号登录系统,访问
/student/my-attendance/即可查看个人考勤百分比
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

