ManyToManyField 関係を持つオブジェクトを追加するクラスベースのジェネリック ビューがあります。その ManyToManyField で作成されたリレーションシップの save() オーバーライドでいくつかの値を変更しようとしていますが、save() で作成されたようには見えないため、get_success_url で post_save メソッドを呼び出す必要があります。関係が作成されます。これは非常に醜いようです。save() を終了する前に関係を強制的に作成するにはどうすればよいでしょうか?
SO でこの回答を見たことがありますが、これは form_valid() をオーバーライドして関係を作成するように言っていますが、 form_valid() と get_success_url() の間のどこかに自動的に作成される場合、なぜこれを行う必要があるのですか?
# models.py
class Payment(models.Model):
invoice = models.ManyToManyField(Invoice)
deposit_date = models.DateField()
check_number = models.CharField(max_length=100, blank=True, null=True)
description = models.TextField(blank=True, null=True)
def post_save(self):
"""
ManyToManyField relationships aren't formed yet when overriding save() for Class Based Generic
Views. Call this whenever you're saving a Payment object.
"""
for invoice in self.invoice.all():
# Do some calcualtions that make us happy
invoice.save()
# views.py - We override get_success_url() in UpdateView too.
class PaymentAdd(CreateView):
model = Payment
form_class = PaymentForm
context_object_name = 'object'
template_name = 'form.html'
def get_success_url(self):
self.object.post_save()
return reverse('payment-page')