Django框架【五】—教學管理模塊代碼實現


一、教學模塊實現

1.班級課程記錄展示

客戶成功轉化后,就成為我們教學機構的學生,既然是我們學生,那么他是報名的什么課程啊,還有報名的具體是哪一期啊?

學校根據學生報名課程來划分班級,而我們的班級記錄表就是用來記錄某個班級某一天課程的詳細信息,比如課程節次,課程內容,課程作業內容等等。

學生學習記錄表就是用來記錄某個班級的每一位學生在某一天的課程學習信息,比如他的考勤,作業提交情況,老師對作業的批語等等。

對應的數據表結構之前已詳細介紹,不再贅述。

from django.db import models

# Create your models here.

# 課程選擇
course_choices = (
    ('Linux', 'Linux高級'),
    ('PythonFullStack', 'Python高級全棧開發'),
    ('BigData', '大數據開發'),
)

# 班級類型
class_type_choices = (('fulltime', '脫產班',),
                      ('online', '網絡班'),
                      ('weekend', '周末班',),)

# 分數分類
score_choices = ((100, 'A+'),
                 (90, 'A'),
                 (85, 'B+'),
                 (80, 'B'),
                 (70, 'B-'),
                 (60, 'C+'),
                 (50, 'C'),
                 (40, 'C-'),
                 (0, ' D'),
                 (-1, 'N/A'),
                 (-100, 'COPY'),
                 (-1000, 'FAIL'),)

# 記錄選項
record_choices = (
    ('checked', "已簽到"),
    ('vacate', "請假"),
    ('late', "遲到"),
    ('absence', "缺勤"),
    ('leave_early', "早退"),
)


# 校區表
class Campuses(models.Model):
    """
    校區表
    """
    name = models.CharField(verbose_name='校區', max_length=64)
    address = models.CharField(verbose_name='詳細地址', max_length=512, blank=True, null=True)

    def __str__(self):
        return self.name


# 班級表
class ClassList(models.Model):
    """
    班級表
    """
    course = models.CharField("課程名稱", max_length=64, choices=course_choices)
    semester = models.IntegerField("學期")  # python20期等
    campuses = models.ForeignKey('Campuses', verbose_name="校區", on_delete=models.CASCADE)
    price = models.IntegerField("學費", default=10000)
    memo = models.CharField('說明', blank=True, null=True, max_length=100)
    start_date = models.DateField("開班日期")
    graduate_date = models.DateField("結業日期", blank=True, null=True)  # 不一定什么時候結業,哈哈,所以可為空

    # contract = models.ForeignKey('ContractTemplate', verbose_name="選擇合同模版", blank=True, null=True,on_delete=models.CASCADE)
    teachers = models.ManyToManyField('rbac.UserInfo', verbose_name="老師")  # 對了,還有一點,如果你用的django2版本的,那么外鍵字段都需要自行寫上on_delete=models.CASCADE

    class_type = models.CharField(choices=class_type_choices, max_length=64, verbose_name='班額及類型', blank=True, null=True)

    class Meta:
        unique_together = ("course", "semester", 'campuses')

    def __str__(self):
        return "{}{}({})".format(self.get_course_display(), self.semester, self.campuses)


class Student(models.Model):
    """
    學生表(已報名)
    """
    customer = models.OneToOneField(verbose_name='客戶信息', to='customer.Customer', on_delete=models.CASCADE, null=True,blank=True)

    class_list = models.ManyToManyField(verbose_name="已報班級", to='ClassList', blank=True, related_name="students")

    emergency_contract = models.CharField(max_length=32, blank=True, null=True, verbose_name='緊急聯系人')

    # 學員畢業就業后的相關信息字段,默認為空
    company = models.CharField(verbose_name='公司', max_length=128, blank=True, null=True)
    date = models.DateField(verbose_name='入職時間', help_text='格式yyyy-mm-dd', blank=True, null=True)
    location = models.CharField(max_length=64, verbose_name='所在區域', blank=True, null=True)
    position = models.CharField(verbose_name='崗位', max_length=64, blank=True, null=True)
    salary = models.IntegerField(verbose_name='薪資', blank=True, null=True)
    welfare = models.CharField(verbose_name='福利', max_length=256, blank=True, null=True)
    memo = models.CharField(verbose_name='備注', max_length=256, blank=True, null=True)

    def __str__(self):
        return self.customer.name


class ClassStudyRecord(models.Model):
    """
    上課記錄表 (班級記錄)
    """
    class_obj = models.ForeignKey(verbose_name="班級", to="ClassList", on_delete=models.CASCADE)
    day_num = models.IntegerField(verbose_name="節次", help_text=u"此處填寫第幾節課或第幾天課程...,必須為數字")
    teacher = models.ForeignKey(verbose_name="講師", to='rbac.UserInfo', on_delete=models.CASCADE)
    date = models.DateField(verbose_name="上課日期")
    course_title = models.CharField(verbose_name='本節課程標題', max_length=64, blank=True, null=True)
    course_memo = models.TextField(verbose_name='本節課程內容概要', blank=True, null=True)
    has_homework = models.BooleanField(default=False, verbose_name="本節有作業", blank=True)
    homework_title = models.CharField(verbose_name='本節作業標題', max_length=64, blank=True, null=True)
    homework_memo = models.TextField(verbose_name='作業描述', max_length=500, blank=True, null=True)
    exam = models.TextField(verbose_name='得分點', max_length=300, blank=True, null=True)

    def __str__(self):
        return "{0} day{1}".format(self.class_obj, self.day_num)


class StudentStudyRecord(models.Model):
    '''
    學生學習記錄
    '''
    student = models.ForeignKey(verbose_name="學員", to='Student', on_delete=models.CASCADE)
    class_study_record = models.ForeignKey(verbose_name="第幾天課程", to="ClassStudyRecord", on_delete=models.CASCADE)

    record = models.CharField("上課紀錄", choices=record_choices, default="checked", max_length=64)
    score = models.IntegerField("本節成績", choices=score_choices, default=-1)

    homework = models.FileField(verbose_name='作業文件', blank=True, null=True, default=None)
    stu_memo = models.TextField(verbose_name='學員備注', blank=True, null=True)
    date = models.DateTimeField(verbose_name='提交作業日期', auto_now_add=True)

    homework_note = models.CharField(verbose_name='作業評語', max_length=255, blank=True, null=True)
    note = models.CharField(verbose_name="備注", max_length=255, blank=True, null=True)

    def __str__(self):
        return "{0}-{1}".format(self.class_study_record, self.student)

    class Meta:
        unique_together = ["student", "class_study_record"]
教學系統詳細表結構

在實現需求之前我們模擬一些數據量,數據內容大致如下:

班級課程url

項目下的url分發

url(r'^education/', include("education.urls")),

education下的url寫法

from education.views import education
from django.conf.urls import url

urlpatterns = [
    # 班級課程記錄展示
    url(r'^class/record/list/', education.ClassStudyRecord.as_view(), name="class_record"),
]

班級課程視圖

班級信息展示url,展示課程的詳細記錄,在班級課程展示的頁面中,有兩個功能要實現:

  1. 對某個班級的學生進行批量創建學習記錄。
  2. 通過點擊班級詳情可以批量修改該班級的所有學生的學習記錄。
# 班級學習記錄視圖
class ClassStudyRecord(views.View):
    @method_decorator(login_required)  # 校驗用戶登錄
    def dispatch(self, request, *args, **kwargs):
        res = super().dispatch(request,*args,**kwargs)
        return res

    def get(self,request):
        # 獲取所有班級的課程記錄
        all_records = models.ClassStudyRecord.objects.all()
        return render(request, "class_record_list.html", {"all_records":all_records})

    def post(self,request):
        # 獲取批量操作類型
        operate = request.POST.get("operate")
        # 獲取批量提交的班級課程記錄id
        selected_id = request.POST.getlist("choose")
        print(operate)
        if hasattr(self,operate):  # 反射類中的批量操作方法
            getattr(self,operate)(selected_id)
        return self.get(request)

    def batch_create(self,selected_id):
        for class_record_id in selected_id:
            # 根據班級課程記錄查到多有的學生對象.
            # 注意班級和學生,一對多關聯,通過班級反向找學生,類名小寫_set.all(),但是外鍵字段取了related_name,所以直接使用別名students.all()
            all_students = models.ClassStudyRecord.objects.get(pk=class_record_id).class_obj.students.all()
            # print(all_students)
            # 給所有學生創建一條學習記錄,只填好學生姓名,和所屬的哪一節課程.
            li = []
            for student in all_students:
                # 根據每一個學生實例化一個學生學習記錄對象
                student_record = models.StudentStudyRecord(
                    student=student,
                    class_study_record_id=class_record_id
                )
                li.append(student_record)
            # 批量創建記錄
            models.StudentStudyRecord.objects.bulk_create(li)

 前端頁面html寫法

批量創建通過select和input的checkbox來提交批量創建的類型和需要批量創建的記錄對象。

{% extends 'BASE.html' %}
{% load static %}
{% block head %}
    {{ block.super }}
{% endblock head %}
{% block title %}
    班級學習記錄表
{% endblock title %}
{% block content %}
    <div class="row">
        <div class="col-xs-12">
            <div class="box">
                <div class="box-header">
                    <h3 class="box-title"></h3>
                    <form action="" method="get" class="navbar-form navbar-left">
                        <div class="input-group">
                            <div class="input-group-btn btn-info">
                                <select name="condition" id="search" class="btn input-group-sm btn-info"
                                        style="border: 0">
                                </select>
                            </div>
                            <input type="text" name="q" class="form-control" placeholder="Search...">
                            <span class="input-group-btn">
                                <button type="submit" id="search-btn" class="btn btn-flat">
                                    <i class="fa fa-search"></i>
                                </button>
                            </span>
                        </div>
                    </form>

                        <a href="" class="btn btn-primary pull-right">新增記錄</a>
                </div>

                <div class="box-body">
                    <div class="row">
                        <div class="col-sm-6">

                        </div>
                    </div>
                    <form action="" method="post">
                        {% csrf_token %}
                        <div class="input-group" style="width: 220px;margin-bottom: 5px;margin-left: 15px">
                            <select name="operate" id="operate" class="form-control btn-default">
                                <option value="batch_create">批量添加學生學習記錄</option>
                            </select>
                            <span class="input-group-btn">
                                <button type="submit" class="btn btn-warning btn-flat">Go!</button>
                            </span>
                        </div>


                        <table id="example2" class="table table-bordered table-hover text-center">
                            <thead>
                            <tr>
                                <th style="width: 8%">
                                    <button type="button" class="btn btn-info btn-xs"><input
                                            type="checkbox" name="batch_choose"></button>
                                </th>
                                <th style="width: 5%">序號</th>
                                <th>班級</th>
                                <th>節次</th>
                                <th>老師</th>
                                <th>課程標題</th>
                                <th>學習詳情</th>
                                <th>操作</th>
                            </tr>
                            </thead>
                            <tbody>
                            {% for record in all_records %}
                                <tr>
                                    <td><input type="checkbox" name="choose" value="{{ record.pk }}"></td>
                                    <td>{{ forloop.counter }}</td>
                                    <td>{{ record.class_obj }}</td>
                                    <td>{{ record.day_num }}</td>
                                    <td>{{ record.teacher }}</td>
                                    <td>{{ record.course_title|default:"暫無" }}</td>
                                    <td><a href="{% url 'student_record' record.pk %}">查看</a></td>
                                    <td>
                                        <a style="color: #00c3cc;" href="">
                                            <i class="fa fa-edit" aria-hidden="true"></i>
                                        </a>
                                        |
                                        <a style="color: #d9534f;" href="" >
                                            <i class="fa fa-trash-o"></i>
                                        </a>
                                    </td>
                                </tr>
                            {% endfor %}
                            </tbody>
                            <tfoot>
                            </tfoot>
                        </table>
                        {% if not all_records %}
                            <h3 class="text-center">沒有相關記錄!</h3>
                        {% endif %}

                        <div class="pull-right" style="display:inline-block; width: 120px;margin: 22px 10px">
                            {{ jump_tag|safe }}
                        </div>

                        <div class="pull-right">
                            {{ paginator_tag|safe }}
                        </div>
                    </form>

                </div>
                <!-- /.box-body -->
            </div>
            <!-- /.box -->
        </div>
        <!-- /.col -->
    </div>
{% endblock content %}
{% block js %}
    {{ block.super }}
{% endblock js %}

{% block customjs %}
    <script>
        $("[name=batch_choose]").click(function () {
            var status = $(this).prop("checked");
            $("[name=choose]").prop('checked', status)
        });
    </script>
{% endblock customjs %}
班級課程記錄

 班級課程記錄頁面效果

2.學生學習記錄展示和批量修改

我們在班級課程展示頁面中實現了一個詳情連接,點擊詳情可以批量修改這個班級所有學生的記錄。

然后學生學習記錄信息也有一個展示頁面,這里學生學習信息頁面展示視圖和批量編輯視圖我們通過一個視圖來實現,get處理頁面展示,post處理批量修改的數據保存。

urls.py文件

# 學員學習記錄展示
url(r'^student/record/list/(\d+)?/?', education.StudentStudyRecord.as_view(), name="student_record"),

視圖文件的寫法

學生學習記錄的批量修改,可以通過兩種方式實現。

  1. 獲取某個班級的所有學生學習記錄,並且獲取學生中字段的選項數據,生成下拉框,或者輸入框,用來獲取提交的批量數據。
  2. 通過modelformset組件,自動生成批量修改的前端頁面。

這里我們詳細介紹一下modelformset方法的使用:生成批量修改頁面,並能根據提交的數據批量保存到數據庫。

為什么使用modelformset?

我們知道modelform可以生成單條記錄的修改頁面,但是無法解決多條記錄的批量修改頁面。所以modelform對於這種場景無法適用。

而modelformset可以根據你傳遞的多條記錄,根據這些記錄對象生成批量修改的頁面,並且批量保存到數據庫。

具體使用方法:

使用modelfromset需要導入一個django的內置模塊

from django.forms.models import modelformset_factory

既然是modelformset,那么也當然少不了modelform,我們在education應用下froms文件夾下新建formauth.py,寫入我們需要的modelform

from django import forms
from student import models


class StudentStudyRecordMF(forms.ModelForm):
    class Meta:
        model = models.StudentStudyRecord  # 指定一個表
        # fields = '__all__'
        fields = ['score','homework_note']  # 只驗證兩個字段,其他字段放行

在視圖中使用

# 第二種方式,通過使用modelformset來生成批量修改的頁面
    def batch_edit_mfs(self,request,class_record_id):
        # 通過班級記錄id,找到班級課程的那一條記錄
        class_record_obj = models.ClassStudyRecord.objects.get(pk=class_record_id)

        # 通過班級對象,找到這節班級課程的所有學生學習記錄
        all_records = models.StudentStudyRecord.objects.filter(
            class_study_record=class_record_obj,
        )

        # 實例化一個form_set對象
        form_set_obj = modelformset_factory(
            model=models.StudentStudyRecord,  # 指定一張表
            form=StudentStudyRecordMF,  # 指定一個modelform
            extra=0  # 可以指定生成表中,新建數據的行數,看頁面效果就理解了
        )

        # 將所有的學生學習記錄傳給form_set對象的queryset
        all_records = form_set_obj(queryset=all_records)

        return render(request,"student_record_edit.html",{"class_record_obj":class_record_obj,"all_records":all_records})

前端頁面中的使用modelformset

<form action="" method="post">
                        {% csrf_token %}
                        <div class="input-group" style="width: 220px;margin-bottom: 5px;margin-left: 15px">
                            <select name="operate" id="operate" class="form-control btn-default">
                            </select>
                            <span class="input-group-btn">
                                <button type="submit" class="btn btn-warning btn-flat">Go!</button>
                            </span>
                        </div>

                        <table id="example2" class="table table-bordered table-hover text-center">
                            {{ all_records.management_form }}  <!-- 這句話一定要加上,固定的昂 不然會報錯['ManagementForm data is missing or has been tampered with'] -->
                            <thead>
                            <tr>
                                <th>姓名</th>
                                <th>考勤</th>
                                <th>作業成績</th>
                                <th>作業評語</th>
                            </tr>
                            </thead>
                            <tbody>
                            {% for record in all_records %}
                                <tr>
                                    {{ record.id }}
                                    <td>{{ record.instance.student }}</td>
                                    <td>{{ record.instance.get_record_display }}</td>
                                    <td>{{ record.score }}</td>
                                    <td>{{ record.homework_note }}</td>
                                </tr>
                            {% endfor %}

                            </tbody>

                        </table>
                        <input type="submit" class="btn btn-success pull-right" value="批量提交">
                        {% if not all_records %}
                            <h3 class="text-center">沒有相關記錄!</h3>
                        {% endif %}

                        <div class="pull-right" style="display:inline-block; width: 120px;margin: 22px 10px">
                            {{ jump_tag|safe }}
                        </div>

                        <div class="pull-right">
                            {{ paginator_tag|safe }}
                        </div>
                    </form>
modelformset前端使用

學生學習記錄的視圖

雖然我們只着重說了modelformset的使用,但是在視圖函數處理中,我把普通方式(自己手動遍歷數據,寫標簽展示)和modelformset自動生成的方式都寫了。有興趣可以詳細查看。

# 學生學習記錄視圖,普通的
class StudentStudyRecord(views.View):
    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        ret = super().dispatch(request,*args,**kwargs)
        return ret

    def get(self,request,class_record_id=None):
        if class_record_id:  # 有班級id,說明是批量修改請求
            # 通過modelformset批量修改
            ret = self.batch_edit_mfs(request,class_record_id)
        else:
            # 沒有是數據展示請求
            ret = self.display(request)
        return ret

    def display(self,request):
        """
        直接請求學生學習記錄展示的頁面
        :param request:
        :return:
        """
        # 找到這節班級課程的所有學生學習記錄
        all_records = models.StudentStudyRecord.objects.all()

        # 獲取分數的可選選項
        score_choices = models.score_choices

        return render(request, "student_study_record_list.html",{"all_records": all_records,"score_choices": score_choices})

    """批量修改展示數據的兩種方式"""
    # 第一種方式,通過手動遍歷數據展示批量修改的數據列表
    def batch_edit(self,request,class_record_id):
        # 通過班級記錄id,找到班級課程的那一條記錄
        class_record_obj = models.ClassStudyRecord.objects.get(pk=class_record_id)

        # 通過班級對象,找到這節班級課程的所有學生學習記錄
        all_records = models.StudentStudyRecord.objects.filter(class_study_record=class_record_obj)

        # 獲取分數的可選選項
        score_choices = models.score_choices

        return render(request,"student_study_record_edit.html",{"class_record_obj":class_record_obj,"all_records":all_records,"score_choices":score_choices})

    # 第二種方式,通過使用modelformset來生成批量修改的頁面
    def batch_edit_mfs(self,request,class_record_id):
        # 通過班級記錄id,找到班級課程的那一條記錄
        class_record_obj = models.ClassStudyRecord.objects.get(pk=class_record_id)

        # 通過班級對象,找到這節班級課程的所有學生學習記錄
        all_records = models.StudentStudyRecord.objects.filter(
            class_study_record=class_record_obj,
        )

        # 實例化一個form_set對象
        form_set_obj = modelformset_factory(
            model=models.StudentStudyRecord,  # 指定一張表
            form=StudentStudyRecordMF,  # 指定一個modelform
            extra=0  # 可以指定生成表中,新建數據的行數,看頁面效果就理解了
        )

        # 將所有的學生學習記錄傳給form_set對象的queryset
        all_records = form_set_obj(queryset=all_records)

        return render(request,"student_study_record_edit.html",{"class_record_obj":class_record_obj,"all_records":all_records})

    """批量提交修改數據的兩種方式"""
    def post(self,request,class_record_id=None):
        # 調用不同的方式來批量修改數據
        self.batch_commit_mfs(request,class_record_id)

        return self.get(request,class_record_id)

    # 第一種方式,通過手動獲取數據,提取數據結構來更新數據
    def batch_commit(self,request,class_record_id):
        data = request.POST
        # print(data)  # <QueryDict: {'csrfmiddlewaretoken': ['R73Lgac0jPy6YwP1guZ4fC5wLsrVY4iGgd45hip6xtcxZNfuiysmRwGt2IZhi0K0'], 'socre_1': ['80'], 'homework_note_1': ['請問'], 'socre_4': ['90'], 'homework_note_4': ['武器二人'], 'socre_5': ['100'], 'homework_note_5': ['未確認']}>

        # 構件我們想要的數據類型
        """
        {
            1:{"score":80,"homework_note":"123"},
            2:{"score":85,"homework_note":"456"},
        }
        """
        cleaned_data = {}
        for key,val in data.items():
            if key == "csrfmiddlewaretoken":continue
            field,pk = key.rsplit("_",1)
            if pk in cleaned_data:
                cleaned_data[pk].update({field:val})
            else:
                cleaned_data[pk] = {field:val}

        for pk,val in cleaned_data.items():
            models.StudentStudyRecord.objects.filter(pk=pk).update(**val)

    # 第二種方式,通過modelformset提供的save方法存儲
    def batch_commit_mfs(self,request,class_record_id):
        # 通過班級記錄id,找到班級課程的那一條記錄
        class_record_obj = models.ClassStudyRecord.objects.get(pk=class_record_id)

        # 實例化一個form_set對象
        form_set_obj = modelformset_factory(
            model=models.StudentStudyRecord,  # 指定一張表
            form=StudentStudyRecordMF,  # 指定一個modelform
            extra=0  # 可以指定生成表中,新建數據的行數,看頁面效果就理解了
        )
        print(request.POST)

        # 將提交的form數據傳給form_set對象
        all_records = form_set_obj(request.POST)
        print(all_records)

        if all_records.is_valid():  # 對提交的數據進行驗證
            all_records.save()  # 如果合法,則保存導數據
        else:  # 如果不合法,將錯誤的提示重新渲染到頁面,
            print(all_records.errors)
學生學習記錄展示

 前端html文件

前端頁面也有兩個,當我們想直接訪問所有學生的學習記錄時,我們直接請求這個url,而並沒有傳遞班級記錄id,這個時候是返回頁面展示的html。

{% extends 'BASE.html' %}
{% load static %}
{% block head %}
    {{ block.super }}
{% endblock head %}
{% block title %}
    學員學習記錄
{% endblock title %}
{% block content %}
    <div class="row">
        <div class="col-xs-12">
            <div class="box">
                <div class="box-header">
                    <h3 class="text-center"></h3>
                    <form action="" method="get" class="navbar-form navbar-left">
                        <div class="input-group">
                            <div class="input-group-btn btn-info">
                                <select name="condition" id="search" class="btn input-group-sm btn-info"
                                        style="border: 0">
                                </select>
                            </div>
                            <input type="text" name="q" class="form-control" placeholder="Search...">
                            <span class="input-group-btn">
                                <button type="submit" id="search-btn" class="btn btn-flat">
                                    <i class="fa fa-search"></i>
                                </button>
                            </span>
                        </div>
                    </form>


                </div>

                <div class="box-body">
                    <div class="row">
                        <div class="col-sm-6">

                        </div>
                    </div>
                    <form action="" method="post">
                        {% csrf_token %}
                        <div class="input-group" style="width: 220px;margin-bottom: 5px;margin-left: 15px">
                            <select name="operate" id="operate" class="form-control btn-default">
                            </select>
                            <span class="input-group-btn">
                                <button type="submit" class="btn btn-warning btn-flat">Go!</button>
                            </span>
                        </div>

                        <table id="example2" class="table table-bordered table-hover text-center">

<!--==========================第一種方式,手動生成批量修改表============================-->
                            <thead>
                            <tr>
                                <th style="width: 8%">
                                    <button type="button" class="btn btn-info btn-xs"><span>批量</span><input
                                            type="checkbox" name="batch_choose"></button>
                                </th>
                                <th style="width: 5%">序號</th>
                                <th>學員</th>
                                <th>考勤</th>
                                <th>成績</th>
                                <th>批語</th>
                                <th>操作</th>
                            </tr>
                            </thead>
                            <tbody>
                            {% for record in all_records %}
                                <tr>
                                    <td><input type="checkbox" name="choose" value="{{ record.pk }}"></td>
                                    <td>{{ forloop.counter }}</td>
                                    <td>{{ record.student }}</td>
                                    <td>{{ record.get_record_display }}</td>
                                    <td>{{ record.score }}</td>
                                    <td>
                                        {{ record.homework_note|default:"暫無" }}
                                    </td>
                                    <td>

                                        <a style="color: #00c3cc;" href="">
                                            <i class="fa fa-edit" aria-hidden="true"></i>
                                        </a>
                                        |
                                        <a style="color: #d9534f;" href="" >
                                            <i class="fa fa-trash-o"></i>
                                        </a>
                                    </td>
                                </tr>
                            {% endfor %}

                            </tbody>
                            <tfoot>
                            </tfoot>
                        </table>
                        {% if not all_records %}
                            <h3 class="text-center">沒有相關記錄!</h3>
                        {% endif %}

                        <div class="pull-right" style="display:inline-block; width: 120px;margin: 22px 10px">
                            {{ jump_tag|safe }}
                        </div>

                        <div class="pull-right">
                            {{ paginator_tag|safe }}
                        </div>
                    </form>

                </div>
                <!-- /.box-body -->
            </div>
            <!-- /.box -->
        </div>
        <!-- /.col -->
    </div>
{% endblock content %}
{% block js %}
    {{ block.super }}
{% endblock js %}

{% block customjs %}
    <script>
        $("[name=batch_choose]").click(function () {
            var status = $(this).prop("checked");
            $("[name=choose]").prop('checked', status)
        });
    </script>
    {{ jump_js|safe }}
{% endblock customjs %}
student_record_list

當我們想批量修改某班級課程的所有學生對象,我們給后端傳遞了一個班級課程id,這個時候需要返回的是批量修改頁面。

{% extends 'BASE.html' %}
{% load static %}
{% block head %}
    {{ block.super }}
{% endblock head %}
{% block title %}
    學員學習記錄
{% endblock title %}
{% block content %}
    <div class="row">
        <div class="col-xs-12">
            <div class="box">
                <div class="box-header">
                    <h3 class="text-center">{{ class_record_obj.class_obj }}-day{{ class_record_obj.day_num }}天-成績錄入</h3>
                    <form action="" method="get" class="navbar-form navbar-left">
                        <div class="input-group">
                            <div class="input-group-btn btn-info">
                                <select name="condition" id="search" class="btn input-group-sm btn-info"
                                        style="border: 0">

                                </select>
                            </div>
                            <input type="text" name="q" class="form-control" placeholder="Search...">
                            <span class="input-group-btn">
                                <button type="submit" id="search-btn" class="btn btn-flat">
                                    <i class="fa fa-search"></i>
                                </button>
                            </span>
                        </div>
                    </form>


                </div>

                <div class="box-body">
                    <div class="row">
                        <div class="col-sm-6">

                        </div>
                    </div>
                    <form action="" method="post">
                        {% csrf_token %}
                        <div class="input-group" style="width: 220px;margin-bottom: 5px;margin-left: 15px">
                            <select name="operate" id="operate" class="form-control btn-default">
                            </select>
                            <span class="input-group-btn">
                                <button type="submit" class="btn btn-warning btn-flat">Go!</button>
                            </span>
                        </div>

                        <table id="example2" class="table table-bordered table-hover text-center">

                            <!--==========================第一種方式,手動生成批量修改表============================-->
                            {#                            <thead>#}
                            {#                            <tr>#}
                            {#                                <th style="width: 8%">#}
                            {#                                    <button type="button" class="btn btn-info btn-xs">#}
                            {#                                        <span>批量</span>#}
                            {#                                        <input type="checkbox" name="batch_choose">#}
                            {#                                    </button>#}
                            {#                                </th>#}
                            {#                                <th style="width: 5%">序號</th>#}
                            {#                                <th>學員</th>#}
                            {#                                <th>考勤</th>#}
                            {#                                <th>成績</th>#}
                            {#                                <th>批語</th>#}
                            {#                            </tr>#}
                            {#                            </thead>#}
                            {#                            <tbody>#}
                            {#                            {% for record in all_records %}#}
                            {#                                <tr>#}
                            {#                                    <td><input type="checkbox" name="choose" value="{{ record.pk }}"></td>#}
                            {#                                    <td>{{ forloop.counter }}</td>#}
                            {#                                    <td>{{ record.student }}</td>#}
                            {#                                    <td>{{ record.get_record_display }}</td>#}
                            {#                                    <td>#}
                            {#                                        <select name="score_{{ record.pk }}" id="">#}
                            {#                                            {% for choice in score_choices %}#}
                            {#                                                {% if record.score == choice.0 %}#}
                            {#                                                    <option value="{{ choice.0 }}" selected>{{ choice.1 }}#}
                            {#                                                        {% else %}#}
                            {#                                                    <option value="{{ choice.0 }}">{{ choice.1 }}#}
                            {#                                                {% endif %}#}
                            {#                                            {% endfor %}#}
                            {#                                        </select>#}
                            {#                                    </td>#}
                            {#                                    <td>#}
                            {#                                        <textarea name="homework_note_{{ record.pk }}" id="" cols="16" rows="1" class="form-control">{{ record.homework_note|default:"" }}</textarea>#}
                            {#                                    </td>#}
                            {#                                </tr>#}
                            {#                            {% endfor %}#}
                            {#                            </tbody>#}



                            <!--==========================第二種方式,通過modelformset生成============================-->
                            {{ all_records.management_form }}  <!-- 這句話一定要加上,固定的昂 不然會報錯['ManagementForm data is missing or has been tampered with'] -->
                            <thead>
                            <tr>
                                <th>姓名</th>
                                <th>考勤</th>
                                <th>作業成績</th>
                                <th>作業評語</th>
                            </tr>
                            </thead>
                            <tbody>
                            {% for record in all_records %}
                                <tr>
                                    {{ record.id }}
                                    <td>{{ record.instance.student }}</td>
                                    <td>{{ record.instance.get_record_display }}</td>
                                    <td>{{ record.score }}</td>
                                    <td>{{ record.homework_note }}</td>
                                </tr>
                            {% endfor %}

                            </tbody>

                        </table>
                        <input type="submit" class="btn btn-success pull-right" value="批量提交">
                        {% if not all_records %}
                            <h3 class="text-center">沒有相關記錄!</h3>
                        {% endif %}

                        <div class="pull-right" style="display:inline-block; width: 120px;margin: 22px 10px">
                            {{ jump_tag|safe }}
                        </div>

                        <div class="pull-right">
                            {{ paginator_tag|safe }}
                        </div>
                    </form>

                </div>
                <!-- /.box-body -->
            </div>
            <!-- /.box -->
        </div>
        <!-- /.col -->
    </div>
{% endblock content %}
{% block js %}
    {{ block.super }}
{% endblock js %}

{% block customjs %}
    <script>
        $("[name=batch_choose]").click(function () {
            var status = $(this).prop("checked");
            $("[name=choose]").prop('checked', status)
        });
    </script>
{% endblock customjs %}
student_record_edit.html

 批量修改學生學習記錄演示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM