Django admin - 保存内联覆盖save_formset

时间:2016-08-04 13:40:36

标签: django django-admin inlines

我对django(1.8)比较新,并且已经阅读过这个问题,所有这些都指向覆盖save_formset函数的链接

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.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 即可。如果有人能就他们的建议提出一些意见,以便我能理解每一行代码,也将不胜感激。

非常感谢。

1 个答案:

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