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)
我个人认为,与从 true
到 1
的更明确的映射相比,它没有吸引力,但意见不一。
因此,我正在使用 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)
我个人认为,与从 true
到 1
的更明确的映射相比,它没有吸引力,但意见不一。