1.做用:用於批量處理多個表單html
form表單對應的組件是formset前端
Modelform對應的組件是modelformsetdjango
2.引入函數
From django.forms.models import modelformset_factorypost
3.參數(沒有默認值的)spa
Model=Studengstudyrecord #對應的模型表插件
form=Studengstudyrecordmodelform #模型表對應的modelformcode
Extra=0 #建立幾個添加的表單,不用就的美好與0orm
4.代碼:model_formset_cls=modelformset_factory(model=StudentStudyRecord,form=StudentStudyRecordModelForm,extra=0)csrf
5.獲取取queryset
queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_study_record_id)
6.構建model formset
formset = model_formset_cls(queryset=queryset)
7.前端頁面
1 return render(request,"record_score.html",locals()) 2 3 4 5 <form method="post" action=""> 6 {% csrf_token %} 7 {{ formset.management_form }} 8 #必定要在form表單中添加{{ formset.management_form }} 9 <table class="table table-bordered"> 10 <thead> 11 <tr> 12 <th>姓名</th> 13 <th>考勤</th> 14 <th>做業成績</th> 15 <th>做業評語</th> 16 </tr> 17 </thead> 18 <tbody> 19 {% for form in formset %} #每個學生記錄對象 20 <tr> 21 {{ form.id }} 22 <td>{{ form.instance.student }}</td> #對某一個字段,不渲染select標籤 23 <td>{{ form.instance.get_record_display }} </td> 24 <td>{{ form.score }} </td> 25 <td>{{ form.homework_note }}</td> 26 </tr> 27 {% endfor %} 28 </tbody> 29 </table> 30 <input type="submit" value="保存"> 31 </form>
8.提交以後的處理
1 def post(self, request,class_study_record_id): 2 model_formset_cls = modelformset_factory(model=StudentStudyRecord, form=StudentStudyRecordModelForm, extra=0) 3 queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_study_record_id) 4 print("request.POST",request.POST) 5 formset=model_formset_cls(request.POST) 6 if formset.is_valid(): 7 formset.save() 8 9 print(formset.errors) 10 11 return redirect(request.path)
1.request.GET.get(「date」,today)
獲取date,若是date取不到用today
2.datetime模塊
Datetime.datetime 以年月日時分秒的格式獲取時間
Datetime.date 以年月日的格式獲取時間
Datetime.time 以時分秒的格式獲取時間
Datetime.timedelta 能夠獲取時間差
例:
mounth = datetime.datetime.now().date() - datetime.timedelta(weeks=4)
Timedelta的參數:
Days:天
seconds:秒
minutes:分鐘
hours:小時
weeks:周
3.統計插件
(1) Highcharts
在產品中心下載,下載的文件中有大量無用的實例,其中的code文件纔是核心文件
引用時,引用的是code文件中的highchart.js
圖標所放的位置用插件中給出的佔位
1 <div id="container" style="width:400px;height:400px"></div>
核心代碼放在script中
1 <script> 2 var chart = Highcharts.chart('container', { 3 chart: { 4 type: 'column' 5 }, 6 title: { 7 text: '成單數' 8 }, 9 xAxis: { 10 type: 'category', 11 labels: { 12 rotation: -45 // 設置軸標籤旋轉角度 13 } 14 }, 15 yAxis: { 16 min: 0, 17 title: { 18 text: '成單個數' 19 } 20 }, 21 legend: { 22 enabled: false 23 }, 24 tooltip: { 25 pointFormat: '成單數: <b>{point.y} 個</b>' 26 }, 27 series: [{ 28 name: '總人口', 29 data: [[1],[2],[3]], 30 dataLabels: { 31 enabled: true, 32 rotation: -90, 33 color: '#FFFFFF', 34 align: 'right', 35 format: '{point.y:.1f}', // :.1f 爲保留 1 位小數 36 y: 10 37 } 38 }] 39 }); 40 </script>
注意:插件對數據的格式要求嚴格,必定要將數據轉換成插件所須要的格式
(2)Echarts
原理同highchart
4.將四個視圖函數合成一個視圖函數(利用字典作條件區分)
1 condition={ 2 "today":[{"pay_date__gte":now},{"pay_date__lte":now},{"customers__pay_date__gte":now},{"customers__pay_date__lte":now}], 3 "yesterday":[{"pay_date__gte":now-yesterday},{"pay_date__lte":now-yesterday},{"customers__pay_date__gte":now-yesterday},{"customers__pay_date__lte":now-yesterday}], 4 "week":[{"pay_date__gte":now-week},{"pay_date__lte":now},{"customers__pay_date__gte":now-week},{"customers__pay_date__lte":now}], 5 "mounth":[{"pay_date__gte":now-mounth},{"pay_date__lte":now},{"customers__pay_date__gte":now-mounth},{"customers__pay_date__lte":now}], 6 }