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

时间:2016-06-13 18:26:00

标签: python django django-forms django-views modelform

所以,我正在使用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()

1 个答案:

答案 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)

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