我对django(1.8)比较新,并且已经阅读过这个问题,所有这些都指向覆盖save_formset函数的链接
已经添加到一个旧线程(Django admin - how to save inlines?)但想要提升为一个单独的线程以获得更好的可见性,此外已经得到了解答。
下面的函数适用于我在保存表单之前修改表单的方法,即将审计字段(创建/修改)更新为USER并小写“enum_value_en”属性。当用户只输入1个条目时,所有工作都有效,但当添加更多条目时,它会更新所有具有SAME值的条目(即数据库中的“enum_value_en”。
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False) # gets instance from memory and add to it before saving it
for obj in formset.deleted_objects:
obj.delete()
for instance in instances:
for form in formset: # cleaned_data is only available on the form, so you have to iterate over formset
instance.modified_by = request.user
instance.created_by = request.user
instance.lowercase_enum_value_en = form.cleaned_data['enum_value_en'].lower()
instance.save()
formset.save_m2m()
实施例
如果条目是'a'和& 'b',两个记录上的小写属性都设置为'b'。
PS 即可。如果有人能就他们的建议提出一些意见,以便我能理解每一行代码,也将不胜感激。
非常感谢。
答案 0 :(得分:0)
问题是您在实例上循环,然后在其中循环遍历表单集。假设有5个表单,这意味着您将每个实例保存5次,每个实例一次。每个实例最终都会从最终的formset中获得相同的值。
在这种情况下,我认为您不需要访问表单的cleaned_data
。只需访问实例的enum_value_en
属性即可。这意味着您不需要导致问题的内部循环。
for instance in instances:
instance.lowercase_enum_value_en = instance.enum_value_en.lower()
instance.modified_by = request.user
instance.created_by = request.user
instance.save()