Django Model Formset:仅跟踪对集合中已更新/保存的项目的更改?

Mic*_*ian 3 python django django-forms modelform django-views

因此,我正在使用Django的Model Formset生成用于不同数据的表单集。效果很好,但是我想添加一个功能,当用户显示表单集并更新10个项目中的2个时,我只能跟踪更新的2个项目,并输出类似“您已更新2个项目”的消息“ 之类的事情。

Django Model Formsets是否为此具有内置API?我似乎在Django Docs上找不到它。

我尝试了各种方法,但是在使用下面的Peter提供的代码时仍然会遇到这种情况:

'Attendance' object has no attribute 'has_changed.' 
Run Code Online (Sandbox Code Playgroud)

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

'list' object has no attribute 'has_changed'
Run Code Online (Sandbox Code Playgroud)

我的查看和发布方法

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")
Run Code Online (Sandbox Code Playgroud)

所以我想通了,只需更改:

formset = formset.save() 
Run Code Online (Sandbox Code Playgroud)

formset.save()
Run Code Online (Sandbox Code Playgroud)

Pet*_*per 5

表单集具有一种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)
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用以下方法计算更改的表格:

def changed_forms(formset):
    return sum(1 for form in formset if form.has_changed())
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意使用布尔值的整数含义:

    return sum(form.has_changed() for form in formset)
Run Code Online (Sandbox Code Playgroud)

我个人认为没有吸引力相比,从更明确映射true1,但意见分歧存在。