Django Model Formset:仅跟踪集合中已更新/保存的那些项目的更改?
Posted
技术标签:
【中文标题】Django Model Formset:仅跟踪集合中已更新/保存的那些项目的更改?【英文标题】:Django Model Formset: only track changes to those items that have been updated/saved in the set? 【发布时间】:2016-10-14 06:48:05 【问题描述】:所以,我使用 Django 的 Model 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(),我会得到 p>
'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】: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
的更明确的映射相比,这并不吸引人,但意见不同。
【讨论】:
感谢@peter DeGlopper...如何将这些数据添加到模板的上下文中?如果我想在我的模板中输出该数据? 您是否熟悉一般将数据添加到上下文中?这和那不会有太大的不同。显然只有将formset绑定到POST
数据后才有可能。
嘿,彼得,我总是遇到错误。我更新了上面的代码示例。看起来我的表单没有使用 has_changed() 方法...
在save
之前执行此操作,或者在此处使用不同的变量名,以便formset
仍然指的是表单集,而不是实例列表:formset = formset.save()
@Miind - 在每个表单级别,是的,如此处所述:***.com/a/43550210以上是关于Django Model Formset:仅跟踪集合中已更新/保存的那些项目的更改?的主要内容,如果未能解决你的问题,请参考以下文章
Django之路——form modelform formset modelformset的各种用法
需要在 Django Formset 中有一个必填字段和可选字段