Django 管理员 - 保存内联覆盖 save_formset
Django admin - saving inlines overriding save_formset
我对 django (1.8) 比较陌生,并且已经阅读了这个问题,所有这些都指向根据这个 link
覆盖 save_formset 函数
已添加到旧线程 (Django admin - how to save inlines?),但想作为一个单独的线程提出以获得更好的可见性,除此之外已经得到回答。
下面的函数在我试图在保存之前修改表单的地方工作,即将审计字段 (created/modified) 更新为 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'。
PS。如果有人可以就他们的建议提出一些意见,以便我能够理解每一行代码,也将不胜感激。
非常感谢。
问题是您正在遍历实例,然后遍历其中的表单集。假设有 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()
我对 django (1.8) 比较陌生,并且已经阅读了这个问题,所有这些都指向根据这个 link
覆盖 save_formset 函数已添加到旧线程 (Django admin - how to save inlines?),但想作为一个单独的线程提出以获得更好的可见性,除此之外已经得到回答。
下面的函数在我试图在保存之前修改表单的地方工作,即将审计字段 (created/modified) 更新为 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'。
PS。如果有人可以就他们的建议提出一些意见,以便我能够理解每一行代码,也将不胜感激。
非常感谢。
问题是您正在遍历实例,然后遍历其中的表单集。假设有 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()