Django 基于类的泛型视图中的ManyToManyField和Save Override
我们有一个基于类的泛型视图,它添加了一个具有ManyToManyField关系的对象。我们正在努力 若要修改save()上的某些值,将覆盖在该ManyToManyField上创建的关系,但似乎没有 就像在save()中创建它们一样,我们不得不在get_success_url中调用post_save方法,以便 都是创造出来的。这看起来非常非常丑陋。在离开save()之前,如何强制创建关系 我看到了,这表示要重写表单_valid()来创建关系,但是如果它们是在表单_valid()和get _success _url()之间的某个位置自动创建的,为什么我需要这样做呢Django 基于类的泛型视图中的ManyToManyField和Save Override,django,django-class-based-views,django-generic-views,Django,Django Class Based Views,Django Generic Views,我们有一个基于类的泛型视图,它添加了一个具有ManyToManyField关系的对象。我们正在努力 若要修改save()上的某些值,将覆盖在该ManyToManyField上创建的关系,但似乎没有 就像在save()中创建它们一样,我们不得不在get_success_url中调用post_save方法,以便 都是创造出来的。这看起来非常非常丑陋。在离开save()之前,如何强制创建关系 我看到了,这表示要重写表单_valid()来创建关系,但是如果它们是在表单_valid()和get _succ
如果每次保存
付款时都必须执行此操作,则最好将此职责留给模型,而不是将其移动到视图中。最好的方法是使用post_save
信号,如下所示:
在models.py
中,在支付
模型定义下方的某处:
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Payment)
def my_handler(sender, instance, **kwargs):
for invoice in instance.invoice.all():
# Do some calcualtions that make us happy
invoice.save()
另一方面,我强烈建议您对M2M字段使用复数属性名称:invoices
,而不是本例中的invoices
。它使您的开发伙伴更加清楚
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Payment)
def my_handler(sender, instance, **kwargs):
for invoice in instance.invoice.all():
# Do some calcualtions that make us happy
invoice.save()