1. 程式人生 > >formset批量處理form表單資料

formset批量處理form表單資料

Formset(表單集)是多個表單的集合。Formset在Web開發中應用很普遍,它可以讓使用者在同一個頁面上提交多張表單,一鍵新增多個數據

class StudentStudyRecordModel(forms.ModelForm):
    class Meta:
        model=StudentStudyRecord
        fields=['score','homework_note']
view檢視
from django.forms.models import modelformset_factory

class Student_study_record(View):
def get(self,request):
        model_formset_cls=modelformset_factory(model=StudentStudyRecord,form=StudentStudyRecordModel,extra=0)
        queryset=StudentStudyRecord.objects.filter(classstudyrecord__id=request.GET.get('pk')) #批量操作的queryset
        formset=model_formset_cls(queryset=queryset)
        
return render(request, 'students/Student_study_record.html', locals()) def post(self,request): model_formset_cls = modelformset_factory(model=StudentStudyRecord, form=StudentStudyRecordModel, extra=0) formset=model_formset_cls(request.POST)  #與modelform校驗基本一致,就是不用穿instance了
if formset.is_valid(): formset.save() return redirect('/class_study_record/') else: print('formset.errors##################',formset.errors) return self.get(request)

templates模版

            <form action="" method="post" novalidate>

                <table class="table table-hover table-striped" style="margin-top: 20px">
                    <thead>
                        <tr>
                            <td>編號</td>
                            <td>姓名</td>
                            <td>考勤</td>
                            <td>成績</td>
                            <td>批語</td>
                        </tr>
                    </thead>
                    <tbody>
{#                     必須有,不然會報錯#}
                    {{ formset.management_form }}
                    {% for form in formset %}
                        <tr>
                            <td>{{ form.id }}</td>           # 必須有form.id
                            <td>{{ form.instance.student }}</td>    #instance是顯示具體的某個物件的值,而不是多選框(不能修改)
                            <td>{{ form.instance.get_record_display }}</td>  
                            <td>{{ form.score }}</td>
                            <td>{{ form.homework_note }}</td>
                            {% csrf_token %}
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
                <button class=" btn btn-success btn-sm pull-right" style="margin: 30px;">提交</button>
            </form>