1

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

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset

已添加到旧线程(Django admin - 如何保存内联?),但希望作为单独的线程提高以获得更好的可见性,除此之外,这已经得到了回答。

下面的功能适用于我在保存表单之前尝试修改表单,即将审计字段(创建/修改)更新为 USER 并将“enum_value_en”属性小写。当用户仅输入 1 个条目时,所有工作都有效,但当添加更多条目时,它会使用相同的值更新所有条目(即数据库中的“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”。

附言。如果有人可以围绕他们的建议提供一些评论,以便我能够理解每一行代码,我将不胜感激。

最欣赏。

4

1 回答 1

1

问题是您正在循环实例,然后循环其中的表单集。假设有 5 个表单,这意味着您将每个实例保存 5 次,每个实例保存一次。每个实例最终都会得到最终表单集中的相同值。

在这种情况下,我认为您不需要访问表单的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()
于 2016-08-04T13:59:31.217 回答