我正在尝试设置一个信号,以便在保存有效表单时运行一个函数来执行相关任务。
我的app结构如下;
- events
- helpers
- __init__.py
- status.py
- models
- signals
- __init__.py
- event.py
- __init__.py
- event.py
- status.py
- views
- __init__.py
- event.py
我认为信号需要在模型之前尽早导入,因此在models/__init__.py
的顶部我已经from .signals import *
。
# views/event.py
class AddEventView(CreateView):
"""
View for adding an Event.
"""
model = Event
form_class = EventForm
success_url = reverse_lazy('events:all_events')
def form_valid(self, form):
self.object = form.save()
signals.event_status.send(
sender=None, request=self.request, event=self.object, status=None
) # Should the sender be self.object?
return super(AddEventView, self).form_valid(form)
# signals/event.py
from django.dispatch import Signal
event_status = Signal(providing_args=["request", "event", "status"])
# helpers/status.py
from ..models import Status, StatusHistory
from ..models.signals import event_status
def create_status(sender, **kwargs):
"""
Create a status for a given event.
"""
event = kwargs['event']
status = kwargs['status']
creator = User.objects.get(pk=event.creator)
try:
current_status = StatusHistory.objects.filter(
event=event).order_by('timestamp')[0]
except IndexError:
# Not sure what we're doing here yet.
pass
if not status:
status = Status.objects.get(description=_("Submitted"))
statushistory = StatusHistory.create(
event=event,
event_status=status,
user=creator
)
statushistory.save()
event_status.connect(create_status)
我在Pycharm中运行调试服务器,并在create_status()
函数&它永远不会被击中。
我实现了这个错误吗?
答案 0 :(得分:8)
我在一些项目中使用了信号,我总是在我的Django APP的__init__.py
中导入信号(与settings.py,views.py,urls.py ...相同的文件夹)< / p>
<强> __初始化__吡啶强>:
import signals
<强> signals.py:强>
from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver
from my_project.models import *
@receiver(post_save, sender=Modelname) # Called after an object is saved
def create_modelname(sender, **kwargs):
obj = kwargs['instance'] # I get the object being saved here
# ... Here I do whatever I want
@receiver(pre_delete, sender=Modelname) # Called before an object is deleted
def delete_modelname(sender, **kwargs):
obj = kwargs['instance']
# ... Do whatever you need
请记住这2次导入:
from django.db.models.signals import post_save, pre_delete
from django.dispatch import receiver
请记住导入信号
import signals
中添加__init__.py
的信号使用此代码,当创建或删除类 Modelname 的对象时,Django会自动调用此函数。
创建对象的接收器在创建对象后被称为,被删除对象的接收器在被删除之前被称为。
答案 1 :(得分:5)
我想您可能只需要导入helpers/status.py
,例如models/__init__.py
否则你的event_status
信号被定义为ok,但信号处理程序create_status
永远不会被Django连接
如果您只有一个处理器用于该信号,那么将它放在与信号定义相同的模块中可能是有意义的
答案 2 :(得分:0)
我发现一种情况,signal
无法正常工作。
在某些情况下,signal
(pre_save,post_save)不会发生。
Model.objects.filter(pk=pk).update(key=value)