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)
表单集具有一种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)
我个人认为没有吸引力相比,从更明确映射true到1,但意见分歧存在。
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |