所以,我正在使用Django的Model Formset为不同的数据生成多组表单。它工作得很好,但我想添加一个功能,当用户显示formset时,例如,更新10个项目中的2个,我只能跟踪2更新,并输出“你已更新2个项目”这样的消息“那种事。
Django Model Formsets有内置的API吗?我似乎无法在Django Docs上找到它。
我尝试了各种方法,但在使用Peter提供的代码时,请继续这样做:
'Attendance' object has no attribute 'has_changed.'
如果我将form.has_changed切换到formset.has_changed(),我会得到
'list' object has no attribute 'has_changed'
我的观看和发布方法
class AttendanceView(TemplateView):
template_name = 'example.html'
def changed_forms(self, formset):
return sum(1 for form in formset if form.has_changed())
def post(self, request, *args, **kwargs):
formset = AttendanceFormSet(request.POST)
if formset.is_valid():
formset = formset.save()
forms_changed = self.changed_forms(formset)
context = self.get_context_data(**kwargs)
context['total_changed_forms'] = forms_changed
return self.render_to_response(context)
else:
return HttpResponse("POST failed")
所以我想出来了,只需改变:
formset = formset.save()
到
formset.save()
答案 0 :(得分:5)
Formsets有一个has_changed
方法,用于报告其表单是否已更改。这不完全是你想要的,但如果你看一下它的实现,它应该告诉你如何去做。那个方法是:
def has_changed(self):
"""
Returns true if data in any form differs from initial.
"""
return any(form.has_changed() for form in self)
因此,您可以使用以下方式计算更改的表单:
def changed_forms(formset):
return sum(1 for form in formset if form.has_changed())
或者,如果您习惯使用布尔值的整数含义:
return sum(form.has_changed() for form in formset)
与从true
到1
的更明确的映射相比,我个人认为没有吸引力,但意见不同。