Django pre_save信号不

2024-04-24 13:54:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我用以下方法测试了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)
  1. 在manage.py shell中运行以上代码: 然后我运行我的网站,看到models.save()成功工作,但是回调函数没有运行。

  2. 或者,我在shell上再次运行上述代码,然后在shell中运行models.save()。”save“再次运行良好,但回调函数仍然没有发生任何变化。

  3. 最后,我将上述代码嵌入到一个__init__.py文件中,然后在网站上运行save()函数。不过,什么也没发生。

你能帮我弄清楚为什么预存信号似乎不起作用吗?


Tags: django方法函数代码pyimport信号网站
3条回答

埃里克的回答之所以有效,是因为他让你在model s.py中连接信号,这样当你通过网站保存模型时,信号处理程序与信号触发程序处于相同的过程中。

在例1和例3中,很容易看出它们为什么不起作用-您正在保存一个不同的过程(网站)到您的信号接收器正在收听。

我希望我能更好地理解为什么示例2也坏了,但我只是在自己的项目中调试了一个类似的问题,同时在shell中测试信号,这肯定与信号发送方和接收方无法“看到”对方有关。

logging.debug()正在使用根记录器,默认情况下,该处理程序级别为30(“WARNING”)。

=>;logging.debug('something')只是根本不做任何事情(调试级别是10<;30)。见http://docs.python.org/2/library/logging.html

应使用另一个自定义记录器执行相同的测试,或执行以下操作:

l = logging.getLogger()
l.setLevel(10)
def my_callback(sender, **kwargs):
    logging.debug("======================================")
pre_save.connect(my_callback)

最初的问题没有包含足够的信息,无法知道它是否是OP面临的真正问题(或部分问题)。
但操作系统的代码肯定不能与我的./manage.py shell一起工作

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

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)

其次,如果您使用的是Django 1.3,那么应该使用新的decorator语法。

# 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("======================================")

应该可以,但我还没有测试过代码,所以如果它仍然坏了,请告诉我。

相关问题 更多 >