本文是基于上一篇文章的改进版,利用插件modelformset_factory完成上文中实现的手动添加
urls.py文件
1 from django.contrib import admin 2 from django.urls import path,re_path 3 from app01 import views 4 5 6 urlpatterns = [ 7 re_path('record_score/(\d+)/', views.RecordScoreView.as_view(), name="record_score"), 8 ]
forms.py文件
1 from django.forms.models import modelformset_factory 2 class StudentStudyRecordModelForm(forms.ModelForm): 3 class Meta: 4 model=StudentStudyRecord 5 fields=["score","homework_note"]
views.py文件
1 class RecordScoreView(View): 2 def get(self, request,class_study_record_id): 3 model_formset_cls=modelformset_factory(model=StudentStudyRecord,form=StudentStudyRecordModelForm,extra=0) 4 queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_study_record_id) 5 formset = model_formset_cls(queryset=queryset) 6 return render(request,"student/record_score.html",locals()) 7 8 def post(self, request,class_study_record_id): 9 model_formset_cls = modelformset_factory(model=StudentStudyRecord, form=StudentStudyRecordModelForm, extra=0) 10 queryset = StudentStudyRecord.objects.filter(classstudyrecord=class_study_record_id) 11 print("request.POST",request.POST) 12 formset=model_formset_cls(request.POST) 13 if formset.is_valid(): 14 formset.save() 15 print(formset.errors) 16 return redirect(request.path)
html文件
1 <div class="panel-heading">学习记录</div> 2 <div class="panel-body"> 3 <div style="width: 680px;margin: 0 auto;"> 4 <form method="post" action=""> 5 {% csrf_token %} 6 {{ formset.management_form }} 7 # 这里一定要加这句代码 8 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 # 隐藏字段 22 {{ form.id }} 23 # 这里只写了一层for循环,所以手动写字段,必须把id字段写上 24 <td>{{ form.student }}</td> 25 <td>{{ form.record }} {{ form.record.errors.0 }}</td> 26 <td>{{ form.score }} {{ form.score.errors.0 }}</td> 27 <td>{{ form.homework_note }} {{ form.homework_note.errors.0 }}</td> 28 </tr> 29 {% endfor %} 30 </tbody> 31 </table> 32 <input type="submit" value="保存"> 33 </form> 34 </div> 35 </div> 36 </div>