Django pre_save信号不起作用

Wei*_* An 10 python django django-signals

我通过以下方式测试了Django的"pre_save"信号,但无法捕获其中任何一个的信号.

$

from django.db.models.signals import pre_save
import logging

def my_callback(sender, **kwargs):
    logging.debug("======================================")
pre_save.connect(my_callback)
Run Code Online (Sandbox Code Playgroud)
  1. 在manage.py shell中运行上面的代码:然后我运行我的网站并看到models.save()成功运行,但回调函数没有运行.

  2. 或者,我再次在shell上运行上面的代码,然后在shell中运行models.save()."save"再次运行良好,但回调函数仍未发生任何变化.

  3. 最后,我将上面的代码嵌入到一个__init__.py文件中,然后在网站上运行save()函数.但事实并非如此.

你能不能帮我弄清楚为什么pre_save信号看起来不起作用?

Eri*_*arr 10

您没有为一个设置发件人类.

from django.db.models.signals import pre_save
from myapp.models import MyModel
import logging

def my_callback(sender, **kwargs):
    logging.debug("======================================")
pre_save.connect(my_callback, sender=MyModel)
Run Code Online (Sandbox Code Playgroud)

其次,如果您使用的是Django 1.3,则应使用新的装饰器语法.

# Inside your models.py
from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver

class MyModel(models.Model):
    field1 = models.TextField()
    field2 = models.IntegerField()

@receiver(pre_save, sender=MyModel)
def mymodel_save_handler(sender, **kwargs):
    logging.debug("======================================")
Run Code Online (Sandbox Code Playgroud)

应该这样做,但我还没有测试过代码,所以请告诉我它是否仍然存在问题.

  • 您不需要指定发送方类,也不需要使用装饰器语法.它不起作用的原因不是上述原因,而是因为他将信号附加到不同的线程中以进行保存. (7认同)