0

モデルCarとがありSeatSeatへの外部キーがありCarます。

models.py で:

class Car(models.Model):
    # ...

class Seat(models.Model):
    car = models.ForeignKey(Car)
    # ...

管理インターフェイスでは、車を追加/変更するときに (インライン フィールドを使用して) 車に座席を追加できます。

admin.py で:

class CarAdmin(admin.ModelAdmin):
    # ...
    inlines = [SeatInline]

class SeatInline(admin.StackedInline):
    model = Seat
    extra = 1

ユーザーが車を追加/変更/削除したりCarAdmin、 を介して座席を追加/変更/削除したりする場合、ユーザーが行ったことをログに記録する必要があるため、特に変更前後のすべての座席を比較する必要があります。

質問は:

座席オブジェクトの 2 つのリストを取得し、それらを比較するにはどうすればよいseats_beforeですseats_afterか? これは、私がアクセスできる場所で行う必要がありますrequest.user

でそれをやろうとしましたが、うまくいきsave_formset()ませんでした。問題の 1 つ: を取得するseats_afterには、変更された座席のリストしか取得できないようです。つまり、変更されていない座席と削除された座席を区別する方法はありません。

def save_formset(self, request, form, formset, change):

    # ...
    instances = formset.save(commit=False)
    seats_after = []
    for instance in instances:
        if isinstance(instance, Seat):
            seats_after.append(instance) # Unchanged seats are not added here
    # ...

seats_before私もこの機能に入るのに苦労しています。

編集:

defuz の提案に従って、次のコードを試しました。

def save_related(self, request, form, formsets, change):

    car_before = form.save(commit=False)
    seats_before = car_before.seats_set.all()

    form.save_m2m()

    seats_after = []
    for formset in formsets:
        instances = formset.save()
        for instance in instances:
            if isinstance(instance, Seat):
                seats_after.append(instance)

この例には、次の 2 つの問題があります。

  1. seats_beforeフォームが保存されたときに関連オブジェクトが保存された場合のように、古いシートではなく新しいシートが含まれているようです。

  2. seats_after変更/追加された座席のみが含まれています。変更されていない座席と削除された座席は表示されません (変更されていない座席も含めたいと思います)。

4

2 に答える 2

1

ModelAdmin.save_related:メソッドを使用します。

于 2012-10-01T20:46:46.253 に答える
0

Django シグナルが探しているものかもしれません。 https://docs.djangoproject.com/en/dev/ref/signals/

于 2012-10-01T23:01:25.393 に答える