成績管理

為了方便老師統計修課學生在課程中的表現,因此再實作一個功能,在同一個頁面上列出所有修課學生的每份作業成績與心得成績。

新增路徑規則

開啟應用程式 Course 的路徑規則檔 course/urls.py,新增第 36 行

urlpatterns = [ path('', CourseList.as_view(), name='course_list'), path('create/', CourseCreate.as_view(), name='course_create'), path('<int:cid>/', CourseView.as_view(), name='course_view'), path('<int:cid>/edit/', CourseEdit.as_view(), name='course_edit'), path('<int:cid>/enroll/', CourseEnroll.as_view(), name='course_enroll'), path('<int:cid>/users/', CourseUsers.as_view(), name='course_users'), path('<int:cid>/seat/', CourseEnrollSeat.as_view(), name='course_seat'), path('<int:cid>/msg/', include(msg_urlpatterns)), path('<int:cid>/assign/', include(assignment_urls)), path('<int:cid>/remark/', include(remark_urls)), path('<int:cid>/score/', CourseScore.as_view(), name='course_score'), ]

新增處理視圖類別

想在頁面上顯示課程裡每位學生每一份作業的成績,得自行由不同的資料夾源擷取相關內容進行組合後,再交由頁面範本顯示。請開啟 course/views.py,新增以下內容:

class CourseScore(CourseAccessMixin, TemplateView): permission = COURSE_PERM_TEACHER template_name = 'course/course_score.html' extra_context = {'title': '成績總表'} def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) students = self.course.enroll_set\ .select_related('stu')\ .order_by('seat') assignments = self.course.assignments.all() aid_list = assignments.values_list('id') # 本課程所有作業編號 acnt = assignments.count() # 本課程所有學生上傳的作品 works = Work.objects.filter(assignment__in=aid_list) # 作業編號 -> 列表索引 idmap = {} for a in enumerate(assignments): idmap[a[1].id] = a[0] # 每位學生的所有作業成績 for stu in students: scores = [0]*(acnt+2) # 作業 + 心得 + 平均 sum = stu.remark_score # 用 filter 函式從 works 篩出當前學生的作品 sworks = filter(lambda w: w.user_id == stu.id, works) for w in sworks: scores[idmap[w.assignment_id]] = w.score sum += w.score scores[acnt] = stu.remark_score scores[acnt+1] = round(sum / (acnt+1), 1) stu.scores = scores ctx['assignment_list'] = assignments ctx['student_list'] = students return ctx

撰寫頁面範本

課程檢視頁面

修改課程檢視頁面範本 templates/course/course_detail.html,插入第 59 - 61 行,新增成績總表按鈕:

{% if course.teacher == user %} <div id="teacher_op" class="btn-group"> <a href="{% url 'course_msgbroadcast' course.id %}" class="{{ b2 }}"> <i class="fas fa-bullhorn"></i> 發布公告 </a> <a href="{% url 'remark_users' course.id %}" class="{{ b2 }}"> <i class="fas fa-lightbulb"></i> 學生心得 </a> <a href=" {% url 'course_score' course.id %}" class="{{ b2 }}"> <i class="fas fa-th"></i> 成績總表 </a> </div> {% endif %}

課程成績總表

新增課程成績總表頁面範本檔 templates/course/course_score.html,內容如下:

{% extends "course/course_detail.html" %} {% block course_detail_body %} <table class="table table-sm table-bordered"> <thead> <tr> <th>學生</th> {% for a in assignment_list %} <th> <span class="badge badge-dark">{{ forloop.counter }}</span> {{ a.title }} </th> {% endfor %} <th>心得</th> <th>平均</th> </tr> </thead> <tbody> {% for stu in student_list %} <tr> <td> <span class="badge badge-primary">{{ stu.seat }}</span> {{ stu.stu.first_name }} </td> {% for s in stu.scores %} <td>{{ s }}</td> {% endfor %} </tr> {% endfor %} </tbody> </table> {% endblock %}