Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
Python post#U保存信号为';我没打电话_Python_Django_Django Models_Django Signals - Fatal编程技术网

Python post#U保存信号为';我没打电话

Python post#U保存信号为';我没打电话,python,django,django-models,django-signals,Python,Django,Django Models,Django Signals,我已经阅读了所有相关的问题 我有两个Django项目,信号在其中一个项目中可以正常工作,但在第二个项目中不能工作(我只是分别复制了粘贴的代码和更改了名称) 我有一个订单应用程序与订单模式。应用程序包含在已安装的应用程序设置中 我在apps.py中有app config: from django.apps import AppConfig class OrdersConfig(AppConfig): name = 'orders' def ready(self):

我已经阅读了所有相关的问题

我有两个Django项目,信号在其中一个项目中可以正常工作,但在第二个项目中不能工作(我只是分别复制了粘贴的代码和更改了名称)

我有一个订单应用程序与订单模式。应用程序包含在已安装的应用程序设置中

我在apps.py中有app config:

from django.apps import AppConfig


class OrdersConfig(AppConfig):
    name = 'orders'

    def ready(self):
        super(OrdersConfig, self).ready()

        # noinspection PyUnresolvedReferences
        import signals
\uuuu init\uuuuu.py

default_app_config = 'orders.apps.OrdersConfig'
最后,signals.py:

@receiver(post_save, sender=Order)
def order_save(sender, instance, created, **kwargs):
    print 'Post save'
    if created:
        print 'Created'
        send_email_new_order.delay(settings.MODERATOR_EMAIL, instance.pk)
信号没有被呼叫。为什么?


Django 1.10.3.

您是否绝对确定导入了正确的
信号?(
print('hi,signals here')
在模块中?)


您可能也希望使用绝对合格的导入(
导入订单.信号
)或相对的导入(
导入.信号作为信号
)。

您是否还有另一个应用程序也被命名为
信号

ready
方法中尝试相对导入:
from。导入信号

何时启动post\u save? 文档内容:在save方法的末尾

它的真正含义是:在save方法成功完成的末尾

什么时候信号不会被触发?
  • 如果
    save
    方法未成功保存对象(例如发生
    IntegrityError
    时)
  • 调用
    MyModel.objects.update()时
  • 重写
    save
    方法并忘记调用超类方法时
  • 当您的信号接收器尚未成功注册时
  • 如何注册接收者 最简单的方法是像您所做的那样使用
    @receiver
    装饰器。另一种选择是使用

    from django.db.models.signals import pre_save
    
    pre_save.connect(order_save, sender='app_label.MyModel')
    
    这个代码应该放在哪里? 如今,美国

    严格地说,信号处理和注册码都可以使用 任何你喜欢的地方,尽管建议避免 要最小化的应用程序根模块及其模型模块 导入代码的副作用

    这可能就是为什么在本例中,您创建了一个名为signals.py的文件,并将代码放在该文件中,而AppConfig类和ready方法遇到了所有这些问题。但有趣的是,报告说:

    你可以把信号处理和注册码放在任何你喜欢的地方。 但是,您需要确保它所在的模块 尽早导入,以便在 任何信号都需要发送。这使你的应用程序的models.py成为一个很好的工具 放置信号处理程序注册的位置

    因此,如果您在注册信号接收器时遇到问题,您可以尝试将代码放入
    models.py
    views.py
    中,并从AppConfig中删除位(甚至可能完全删除AppConfig)

    如果要在AppConfig中执行注册,并且在
    @receiver
    和/或导入方面遇到问题,可以尝试

    from django.db.models.signals import pre_save
    from app_label.signals import my_reciever
    
    def ready(self):
        pre_save.connect(my_reciever, sender='app_label.MyModel')
    
    如何避免重复?
    信号会被触发两次吗?确保只注册一次接收器。如果在
    AppConfig
    中注册它,将其从
    models.py
    和vice-verce

    Hm中删除,并用print检查,它会被调用两次-可以吗?这应该不是问题。尝试在模型末尾定义信号。如果将信号放入模型文件中,发送方是否为self?