Django Model Formset:只跟踪集合中 updated/saved 的那些项目的更改?

Django Model Formset: only track changes to those items that have been updated/saved in the set?

因此,我正在使用 Django 的模型表单集为不同的数据生成表单集。它工作得很好,但我想添加一个功能,当用户显示表单集并更新 10 个项目中的 2 个时,我可以只跟踪更新的 2 个,并输出类似 "You have updated 2 items" kind 的消息-的东西。

Django Model Formsets 是否为此内置了 API?我似乎无法在 Django 文档中找到它。

我已经尝试了各种方法,但在使用下面 Peter 提供的代码时仍然会遇到这个问题:

'Attendance' object has no attribute 'has_changed.' 

如果我将 form.has_changed 切换为 formset.has_changed(),我会得到

'list' object has no attribute 'has_changed'

我的观点和Post方法

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()

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)

我个人认为,与从 true1 的更明确的映射相比,它没有吸引力,但意见不一。