1.初始化 course_record, study_record.
2.學習記錄
3.錄入成績
4.顯示成績 ajax 查詢 柱狀圖展現成績 highcharts
5.上傳做業(os模塊)
6.下載做業
錄入courserecord數據javascript
知識點css
students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk) for student in students_list: student_obj = StudyRecord(course_record=course_record,student=student) temp.append(student_obj)
StudyRecord.objects.bulk_create(temp)
def patch_studyrecord(self,request,queryset): # print('queryset:--》',queryset) temp = [] for course_record in queryset: # 與course_record 關聯得班級對應得學生 students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk) for student in students_list: student_obj = StudyRecord(course_record=course_record,student=student) temp.append(student_obj) StudyRecord.objects.bulk_create(temp) actions = [patch_studyrecord] patch_studyrecord.short_description = "批量生成學習記錄"
知識點html
mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>記錄</a>"%(obj.pk))
改一下全局的: # if filter_field in self.list_filter: if filter_field !="page": filter_condition.children.append((filter_field, val))
放到全局: if field_obj.choices: val = getattr(obj,"get_"+field+"_display") else: val = getattr(obj, field)
queryset.update(record="late")
----------------------- def record(self, obj=None, header=False): if header: return "學習記錄" return mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>記錄</a>"%(obj.pk)) list_display = ["class_obj", 'day_num', "teacher", record, record_score ] --------------------- class StudyRecordConfig(ModelStark): list_display = ['student','course_record','record','score'] def patch_late(self, request, queryset): queryset.update(record="late") patch_late.short_description = "遲到" actions = [patch_late] site.register(StudyRecord,StudyRecordConfig)
知識點前端
mark_safe("<a href='record_score/%s'>錄入成績</a>"%obj.pk)
def extra_url(self): temp = [] temp.append(url(r'^record_score/(\d+)', self.score)) return temp
request.post: ''' <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'], 'score_33': ['100'], 'homework_note_33': ['很好'], 'score_34': ['85'], 'homework_note_34': ['棒'], 'score_35': ['60'], 'homework_note_35': ['None']}> '''
data = {} # data={"33":{"score":100,"homework_note":'xxx'},} for key,value in request.POST.items(): if key == "csrfmiddlewaretoken":continue field, pk = key.rsplit('_', 1) if pk in data: data[pk][field] = value else: data[pk] = {field:value} print("data-->",data) ''' {'33': {'score': '100', 'homework_note': '很好'}, '34': {'score': '85', 'homework_note': '棒'}, '35': {'score': '60', 'homework_note': 'None'}} '''
for pk,update_data in data.items(): StudyRecord.objects.filter(pk=pk).update(**update_data)
return redirect(request.path)
study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id) score_choices = StudyRecord.score_choices return render(request,'score.html',locals())
def score(self,request, course_record_id): if request.method == "POST": print('post::::', request.POST) ''' <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'], 'score_33': ['100'], 'homework_note_33': ['很好'], 'score_34': ['85'], 'homework_note_34': ['棒'], 'score_35': ['60'], 'homework_note_35': ['None']}> ''' data = {} # data={"33":{"score":100,"homework_note":'xxx'},} for key,value in request.POST.items(): if key == "csrfmiddlewaretoken":continue field, pk = key.rsplit('_', 1) if pk in data: data[pk][field] = value else: data[pk] = {field:value} print("data-->",data) ''' {'33': {'score': '90', 'homework_note': '很好'}, '34': {'score': '80', 'homework_note': '幫幫噠'}, '35': {'score': '50', 'homework_note': '沒問題'}} ''' for pk,update_data in data.items(): StudyRecord.objects.filter(pk=pk).update(**update_data) return redirect(request.path) else: study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id) score_choices = StudyRecord.score_choices return render(request,'score.html',locals()) def extra_url(self): temp = [] temp.append(url(r'^record_score/(\d+)', self.score)) return temp def record_score(self, obj=None, header=False): if header: return "錄入成績" return mark_safe("<a href='record_score/%s'>錄入成績</a>"%obj.pk) list_display = ["class_obj", 'day_num', "teacher", record, record_score ]
score.htmljava
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href=""> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css"> </head> <body> <h3>錄入成績</h3> <div class="container"> <div class="row"> <div class="col-md-9 col-md-offset-1"> <form action="" method="post"> {% csrf_token %} <table class="table table-bordered table-striped"> <thead> <tr> <th>學生姓名</th> <th>考勤</th> <th>成績</th> <th>批語</th> </tr> </thead> <tbody> {% for study_record in study_record_list %} <tr> <td>{{ study_record.student }}</td> <td>{{ study_record.get_record_display }}</td> <td style="width: 100px; padding: 5px 10px;"> <select name="score_{{ study_record.pk }}" id="" class="form-control"> {% for item in score_choices %} {% if study_record.score == item.0 %} <option selected value="{{ item.0 }}">{{ item.1 }}</option> {% else %} <option value="{{ item.0 }}">{{ item.1 }}</option> {% endif %} {% endfor %} </select> </td> <td> <textarea name="homework_note_{{ study_record.pk }}" id="" cols="30" rows="3" class="form-control">{{ study_record.homework_note }}</textarea> </td> </tr> {% endfor %} </tbody> </table> <input type="submit" class="btn btn-default pull-right"> </form> </div> </div> </div> </body> </html>
知識點jquery
mark_safe("<a href='/stark/crm/student/score_view/%s'>查當作績</a>"%obj.pk)
temp.append(url(r'^score_view/(\d+)', self.score_view))
student = Student.objects.filter(pk=sid).first()
class_list = student.class_list.all()
sid = request.GET.get('sid')
cid = request.GET.get('cid')
準備數據:[['day94', 85], ['day95', 85], ['day96', 60]]
study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid)
data_list = []
for study_record in study_record_list:
day_num = study_record.course_record.day_num
data_list.append(["day%s"%day_num,study_record.score])
print('----',data_list) # [['day94', 85], ['day95', 85], ['day96', 60]]
返回JsonResponse,非字典須要加上 safe = False
return JsonResponse(data_list,safe=False)
注意:cid sid 用法; ajax 顯示 highcharts 柱狀圖
<a class="check_chart" cid="{{ cls.pk }}" sid="{{ student.pk }}">查當作績</a>
<div id="container" style="width: 600px; height: 400px;"></div> <script type="text/javascript"> $('.check_chart').click(function () { $.ajax({ url:"", type:"get", data:{ cid:$(this).attr('cid'), sid:$(this).attr('sid') }, success:function (data) { // 顯示柱狀圖 var chart = Highcharts.chart('container', { chart: { type: 'column' }, title: { text: '查看學生天天的成績' }, subtitle: { text: '數據截止 2017-03,來源: <a href="https://en.wikipedia.org/wiki/List_of_cities_proper_by_population">Wikipedia</a>' }, xAxis: { type: 'category', labels: { rotation: -45 // 設置軸標籤旋轉角度 } }, yAxis: { min: 0, title: { text: '分數' } }, legend: { enabled: false }, tooltip: { pointFormat: '分數: <b>{point.y:.1f} </b>' }, series: [{ name: '總人口', data: data, dataLabels: { enabled: true, rotation: -90, color: '#FFFFFF', align: 'right', format: '{point.y:.1f}', // :.1f 爲保留 1 位小數 y: 10 } }] }); } }) }); </script>
from django.http import JsonResponse class StudentConfig(ModelStark): def score_view(self,request,sid): if request.is_ajax(): # print(request.GET) cid = request.GET.get('cid') sid = request.GET.get('sid') # 跨表查 study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid) data_list = [] for study_record in study_record_list: day_num = study_record.course_record.day_num data_list.append(["day%s"%day_num,study_record.score]) # # [['day94', 85], ['day95', 85], ['day96', -1]] return JsonResponse(data_list,safe=False) else: student = Student.objects.filter(pk=sid).first() class_list = student.class_list.all() return render(request,'score_view.html', locals()) def extra_url(self): temp = [] temp.append(url(r"^score_view/(\d+)",self.score_view)) return temp def score_show(self, obj=None, header=False): if header: return "查當作績" return mark_safe("<a href='score_view/%s'>查當作績</a>"%obj.pk) list_display = ['customer','class_list',score_show] list_display_links = ['customer'] site.register(Student,StudentConfig)
# -*- coding:utf-8 -*- from .models import * from stark.service.stark import site, ModelStark from django.utils.safestring import mark_safe from django.conf.urls import url from django.shortcuts import HttpResponse,reverse,redirect,render class DepartmentConfig(ModelStark): list_display = ['title', 'code'] site.register(Department, DepartmentConfig) class UserInfoConfig(ModelStark): list_display = ["name", 'email', 'depart'] site.register(UserInfo, UserInfoConfig) class ClassListConfig(ModelStark): def display_classname(self,obj=None,header=False): if header: return "班級名稱" return "%s(%s)"%(obj.course.name, obj.semester) list_display = [display_classname, 'tutor', 'teachers'] site.register(ClassList, ClassListConfig) class CustomerConfig(ModelStark): def display_course(self, obj=None, header=False): if header: return "諮詢課程" temp = [] for course in obj.course.all(): temp.append("<a href='/stark/crm/customer/cancel_course/%s/%s' style='border:1px solid #369; padding:3px 6px;'><span>%s</span></a> "%(obj.pk,course.pk,course.name)) return mark_safe("".join(temp)) def cancel_course(self, request, customer_id, course_id): customer_obj = Customer.objects.filter(pk=customer_id).first() customer_obj.course.remove(course_id) return redirect(self.get_list_url()) # 重定向到當前表得查看頁面 def extra_url(self): temp = [] temp.append(url(r'^cancel_course/(\d+)/(\d+)', self.cancel_course)) return temp list_display = ["name", "gender",display_course ,"consultant"] site.register(Customer, CustomerConfig) class ConsultRecordConfig(ModelStark): list_display = ["customer", 'consultant','date','note'] site.register(ConsultRecord, ConsultRecordConfig) from django.http import JsonResponse class StudentConfig(ModelStark): def score_view(self,request,sid): if request.is_ajax(): # print(request.GET) cid = request.GET.get('cid') sid = request.GET.get('sid') # 跨表查 study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid) data_list = [] for study_record in study_record_list: day_num = study_record.course_record.day_num data_list.append(["day%s"%day_num,study_record.score]) # # [['day94', 85], ['day95', 85], ['day96', -1]] return JsonResponse(data_list,safe=False) else: student = Student.objects.filter(pk=sid).first() class_list = student.class_list.all() return render(request,'score_view.html', locals()) def extra_url(self): temp = [] temp.append(url(r"^score_view/(\d+)",self.score_view)) return temp def score_show(self, obj=None, header=False): if header: return "查當作績" return mark_safe("<a href='score_view/%s'>查當作績</a>"%obj.pk) list_display = ['customer','class_list',score_show] list_display_links = ['customer'] site.register(Student,StudentConfig) class CourseRecordConfig(ModelStark): def score(self,request, course_record_id): if request.method == "POST": print('post::::', request.POST) """ <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'], 'score_33': ['100'], 'homework_note_33': ['很好'], 'score_34': ['85'], 'homework_note_34': ['棒'], 'score_35': ['60'], 'homework_note_35': ['None']}> """ data = {} # data={"33":{"score":100,"homework_note":'xxx'},} for key,value in request.POST.items(): if key == "csrfmiddlewaretoken":continue field, pk = key.rsplit('_', 1) if pk in data: data[pk][field] = value else: data[pk] = {field:value} print("data-->",data) """ {'33': {'score': '90', 'homework_note': '很好'}, '34': {'score': '80', 'homework_note': '幫幫噠'}, '35': {'score': '50', 'homework_note': '沒問題'}} """ for pk,update_data in data.items(): StudyRecord.objects.filter(pk=pk).update(**update_data) return redirect(request.path) else: study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id) score_choices = StudyRecord.score_choices return render(request,'score.html',locals()) def extra_url(self): temp = [] temp.append(url(r'^record_score/(\d+)', self.score)) return temp def record(self, obj=None, header=False): if header: return "學習記錄" return mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>記錄</a>"%(obj.pk)) def record_score(self, obj=None, header=False): if header: return "錄入成績" return mark_safe("<a href='record_score/%s'>錄入成績</a>"%obj.pk) list_display = ["class_obj", 'day_num', "teacher", record, record_score ] def patch_studyrecord(self,request,queryset): # print('queryset:--》',queryset) temp = [] for course_record in queryset: # 與course_record 關聯得班級對應得學生 students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk) for student in students_list: student_obj = StudyRecord(course_record=course_record,student=student) temp.append(student_obj) StudyRecord.objects.bulk_create(temp) actions = [patch_studyrecord] patch_studyrecord.short_description = "批量生成學習記錄" site.register(CourseRecord,CourseRecordConfig) class StudyRecordConfig(ModelStark): list_display = ['student','course_record','record','score'] def patch_late(self, request, queryset): queryset.update(record="late") patch_late.short_description = "遲到" actions = [patch_late] site.register(StudyRecord,StudyRecordConfig) site.register(Course) site.register(School)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css"> <script src="/static/js/jquery-1.12.4.min.js"></script> <script src="/static/chart/highcharts.js"></script> </head> <body> <h3>查看{{ student }}成績</h3> <div class="container"> <div class="row"> <div class="col-md-9"> <form action=""> <table class="table-bordered table table-striped"> <thead> <tr> <th>班級</th> <th>班主任</th> <th>任課老師</th> <th>課程成績</th> </tr> </thead> <tbody> {% for cls in class_list %} <tr> <td>{{ cls }}</td> <td>{{ cls.tutor }}</td> <td> {% for teacher in cls.teachers.all %} <span>{{ teacher }}</span>, {% endfor %} </td> <td> <a class="check_chart" cid="{{ cls.pk }}" sid="{{ student.pk }}">查當作績</a> </td> </tr> {% endfor %} </tbody> </table> </form> </div> </div> </div> <div id="container" style="width: 600px; height: 400px;"></div> <script type="text/javascript"> $('.check_chart').click(function () { $.ajax({ url:"", type:"get", data:{ cid:$(this).attr('cid'), sid:$(this).attr('sid') }, success:function (data) { // 顯示柱狀圖 var chart = Highcharts.chart('container', { chart: { type: 'column' }, title: { text: '查看學生天天的成績' }, subtitle: { text: '數據截止 2017-03,來源: <a href="https://en.wikipedia.org/wiki/List_of_cities_proper_by_population">Wikipedia</a>' }, xAxis: { type: 'category', labels: { rotation: -45 // 設置軸標籤旋轉角度 } }, yAxis: { min: 0, title: { text: '分數' } }, legend: { enabled: false }, tooltip: { pointFormat: '分數: <b>{point.y:.1f} </b>' }, series: [{ name: '總人口', data: data, dataLabels: { enabled: true, rotation: -90, color: '#FFFFFF', align: 'right', format: '{point.y:.1f}', // :.1f 爲保留 1 位小數 y: 10 } }] }); } }) }); </script> </body> </html>