1

私は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 つだけ入力した場合はすべて機能しますが、さらに追加すると、すべてのエントリが同じ値 (つまり、データベースの「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。コードの各行を理解できるように、誰かが提案についてコメントを提供してくれるとありがたいです。

最も高く評価されています。

4

1 に答える 1

1

問題は、インスタンスをループしてから、その中のフォームセットをループしていることです。5 つのフォームがあるとします。つまり、各インスタンスを 5 回 (インスタンスごとに 1 回) 保存することになります。すべてのインスタンスは、最終的なフォームセットから同じ値になります。

この場合、フォームの にアクセスする必要はないと思います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 に答える