我正在使用django-extra-views中的ModelFormSetView,但无法保存ModelFormSet所基于的模型对象
class StudentEnrolInClassView(SuccessMessageMixin, ModelFormSetView):
model = StudentApplication
...
def formset_valid(self, formset):
for student_application in formset.cleaned_data:
if student_application['school_class']:
appl = student_application['id']
student = Student()
...
student.save()
enrolment = Enrolment(student=student, school_class=student_application['school_class'])
enrolment.save()
appl.approved = datetime.datetime.now()
appl.student = student
appl.save() # THIS ISN'T SAVING!
return super(StudentEnrolInClassView, self).formset_valid(formset)
新创建的学生和注册对象可以正确保存,但预先存在(和更新)的应用程序不会保存,但不会抛出任何错误或警告。我尝试使用以下方法从数据库中获取新的实例:
appl = StudentApplication.objects.get(id=student_application['id'].id)
但这没有任何效果。
任何想法会发生什么?
答案 0 :(得分:1)
最后,我发现问题出在最后调用super formset_valid()函数时。 ModelFormSetView中的formset_valid()保存formset的对象。在这种情况下,由于原始对象仅用于查看(不是编辑),因此它保存原始对象,在之后未修改它已将修改后的对象保存在视图中。所以上面的代码正确保存,只是那些我们在不久之后用原始对象覆盖的对象。通过替换
解决了这个问题return super(StudentEnrolInClassView, self).formset_valid(formset)
与
return HttpResponseRedirect(self.get_success_url())