本文是基于上一篇文章的改进版,利用插件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>
01-12 17:52
查看更多