基于我正在阅读的Django文档,似乎signals.py在app文件夹中是一个很好的开始,但我面临的问题是,当我创建信号时pre_save,我尝试从模型中导入类,它与import在我的模型中.
# models.py
from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import gettext as _
from signals import *
class Comm_Queue(CommunicatorAbstract):
queue_statuses = (
('P', _('Pending')),
('S', _('Sent')),
('E', _('Error')),
('R', _('Rejected')),
)
status = models.CharField(max_length=10, db_index=True, default='P')
is_html = models.BooleanField(default=False)
language = models.CharField(max_length=6, choices=settings.LANGUAGES)
sender_email = models.EmailField()
recipient_email = models.EmailField()
subject = models.CharField(max_length=100)
content = models.TextField()
Run Code Online (Sandbox Code Playgroud)
# signals.py
from django.conf import settings
from django.db.models.signals import pre_save
from django.dispatch import receiver
from …Run Code Online (Sandbox Code Playgroud) 我试图在我的django 1.2项目中的某些类中定义"before_save"方法.我在将信号连接到models.py中的类方法时遇到问题.
class MyClass(models.Model):
....
def before_save(self, sender, instance, *args, **kwargs):
self.test_field = "It worked"
Run Code Online (Sandbox Code Playgroud)
我已经尝试将pre_save.connect(before_save,sender ='self')放在'MyClass'本身,但没有任何反应.
我也尝试将它放在models.py文件的底部:
pre_save.connect(MyClass.before_save, sender=MyClass)
Run Code Online (Sandbox Code Playgroud)
我在这里读到了将信号连接到类方法,但无法弄清楚代码.
谁知道我做错了什么?
嗨,我正在定义自己的信号和接收器.我只是想知道我应该把代码放在哪里.它位于models.py或views.py中.请帮忙
一旦芹菜任务完成,我想更新我的模型对象.我现在不知道如何去做这件事.
这是文件的布局
from photos.tasks import photo_download
class Photo(models.Model):
....fields....
@receiver(post_save)
def download_photo_callback(sender, **kwargs):
photo = kwargs["instance"]
result = photo_download.delay(photo.uid)
Run Code Online (Sandbox Code Playgroud)
from photo.models import Photo
@task()
def photo_download(photo_uid, callback=None):
...do stuff...
photo.status = 'D'
photo.save()
Run Code Online (Sandbox Code Playgroud) 我的models.py:>
class Aval(models.Model):
cliente = models.ForeignKey(Cliente)
salao = models.ForeignKey(Salao)
rate = models.IntegerField(choices=RATE, default=5)
criacao = models.DateTimeField(blank=True, null=True, auto_now=True)
comentario = models.TextField(max_length=400, blank=True, null=True, default=None)
aprovado = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)
我的signals.py:>
@receiver(post_save, sender=Aval)
def new_rate(sender, instance, created, **kwargs):
aval = instance
print("Aval is saved.")
Run Code Online (Sandbox Code Playgroud)
我正在为Aval模型测试信号post_save,当我保存一些对象Aval时,它不打印"Aval被保存".我做错了什么?
似乎Django允许在启动时执行代码 - 当应用程序启动时,但是,它不清楚我应该把代码放在哪里.那么如何在Django 1.7中启动时执行代码呢?
我把我的信号接收器代码放在相应的模型文件中.
但是,信号接收器不断增长,我想将它们分成多个文件.
我还没有看到有关放置信号接收器代码的位置的讨论.
(让我怀疑我不应该制造许多信号接收器吗?)
我在连接django中的信号时遇到问题.我一直在关注http://dmitko.ru/?p=546上提供的教程,并尝试扩展用户注册.
我已经正确设置了django-registration.它工作正常.出于调试目的,我将以下代码放入我的urls.py中:
from registration.signals import user_registered
def log_user_created(sender, user, request, ** kwargs):
logger.debug("got USER_REGISTERED signal")
if settings.DEBUG:
logger.debug("registering debug signal listeners")
user_registered.connect(log_user_created)
else:
logger.debug("debuging signals not enabled")
Run Code Online (Sandbox Code Playgroud)
但是永远不会调用log_user_created函数.
我的问题是:如何调试我的应用程序以查看吞下user_registered信号的位置?
注意:我已经检查过我的django-registration版本是否正常工作.我已将我的版本改为上述博客示例应用程序中的版本.它没有改变观察到的行为.