Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 基于类的泛型视图中的ManyToManyField和Save Override_Django_Django Class Based Views_Django Generic Views - Fatal编程技术网

Django 基于类的泛型视图中的ManyToManyField和Save Override

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

我们有一个基于类的泛型视图,它添加了一个具有ManyToManyField关系的对象。我们正在努力 若要修改save()上的某些值,将覆盖在该ManyToManyField上创建的关系,但似乎没有 就像在save()中创建它们一样,我们不得不在get_success_url中调用post_save方法,以便 都是创造出来的。这看起来非常非常丑陋。在离开save()之前,如何强制创建关系

我看到了,这表示要重写表单_valid()来创建关系,但是如果它们是在表单_valid()和get _success _url()之间的某个位置自动创建的,为什么我需要这样做呢


如果每次保存
付款时都必须执行此操作,则最好将此职责留给模型,而不是将其移动到视图中。最好的方法是使用
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()