4

関連する 2 つの (foreignkey リレーションによる) モデルがあり、インラインを持つ親の管理モデルを作成しました。いくつかのケース (管理者でブール フィールドによって編集) では、以前のオブジェクト (インライン) をすべて削除し、新しいオブジェクトを作成する必要があります。私は現在のオブジェクトのすべてのプロパティを取得し、(インライン) オブジェクトを再作成する必要があるかどうかを判断できる save_model で作成しようとしました。モデル:

class Model1(models.Model):
    reformat = models.BooleanField(default=False)
    ...
class Model2(models.Model):
    model1 = ForeignKey(Model1, related_name='model2')
    ...

管理者:

class Model2Inline(admin.TabularInline):
    model = Model2

class Model1Admin(admin.ModelAdmin):
    inlines = [Model2Inline]
    def save_model(self, request, obj, form, change):
        super(Model1Admin, self).save_model(request, obj, form, change)
        if obj.reformat:
            obj.model2.all().delete()
            # creating new objects
            ...
        obj.save()

しかし、model_save メソッドでこれらのオブジェクトを削除しようとすると、ValidationError が発生します。この問題を解決する他の可能性はありますか?

4

1 に答える 1

5

私もこの問題に遭遇し、壁に頭をぶつけて1、2時間後、スーパークラスのメソッドを呼び出した後、save_formset()代わりにadminオブジェクトをオーバーライドし、必要な操作を行うことで問題を解決しました。このようにすると、フォームセットが保存されたときに削除するモデルがまだ存在しているため、検証エラーが発生しません。save_model()save_formset()

与えた例では、次のようになります。

class Model2Inline(admin.TabularInline):
    model = Model2

class Model1Admin(admin.ModelAdmin):
    inlines = [Model2Inline]
    def save_formset(self, request, form, formset, change):
        super(Model1Admin, self).save_formset(request, form, formset, change)
        if formset.model is Model2:
            obj = formset.instance
            if obj.reformat:
                obj.model2.all().delete()
                # creating new objects
                ...
            obj.save()
于 2012-01-11T14:57:03.963 に答える