モデルCar
とがありSeat
、Seat
への外部キーがあり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 つの問題があります。
seats_before
フォームが保存されたときに関連オブジェクトが保存された場合のように、古いシートではなく新しいシートが含まれているようです。seats_after
変更/追加された座席のみが含まれています。変更されていない座席と削除された座席は表示されません (変更されていない座席も含めたいと思います)。