2013-03-22 29 views
2

在我的示例中,信号功能是在models.py中创建的。相反,我认为可以使用自定义信号概念。Django使用自定义信号发送邮件

我的信号功能models.py是

class Book(models.Model): 
    [..........] 

def send_update(sender, instance, created, **kwargs): 
    if instance.author_name: 
     message = "Book is updated" 
     subject = "Updates" 
     send_mail(subject, message, your_email, 
      [instance.email,]) 

post_save.connect(send_update, sender=Book) 

views.py是

if request.POST: 
     form = BookForm(request.POST) 

     if form.is_valid(): 
      cd = form.cleaned_data 
      form.save() 
      return redirect('/index/') 
    return render_to_response('addbook.html',{ 'form':form },context_instance=RequestContext(request)) 

这不是我们如何创建一个使用signals.py文件发送邮件的自定义信号。

我想在实践中学习这个,一个例子会帮助我做到这一点。

感谢

+0

你的意思是你想定义的,而不是使用'pre_save'自己的信号,? – valtron 2013-03-22 06:37:21

回答

10

signals.py

from django.db.models.signals import post_save 
from app.models import Book 

def send_update(sender, instance, created, **kwargs): 
    if instance.author_name: 
     message = "Book is updated" 
     subject = "Updates" 
     send_mail(subject, message, your_email, 
      [instance.email,]) 

post_save.connect(send_update, sender=Book) 

通过在应用程序的__init__.py文件中导入信号来注册信号。这将允许从signals.pyimport models

__init__.py

import signals 
+0

导入信号不给模块命名信号如何? – gamer 2015-07-03 10:40:23

1

定义你的信号和接收器在signals.py

from django.dispatch import Signal 

post_update = Signal(providing_args = ['instance']) 

def send_update(...): 
    .... 

post_update.connect(send_update, sender = Book) 

views.py,送你保存表单之后的信号:

instance = form.save() 
post_update.send(sender = Book, instance = instance) 
+0

而不是使用models.py来定义和连接信号,我们可以使用单独的signals.py文件来做到这一点。如果是这样,请指导我如何去做 – user2086641 2013-03-22 06:47:33

+0

您可以将该代码放在'signals.py'中,它可以工作。但是,我建议'''''''''''''''''''连接'信号,因为接收应该被定义并连接在同一个文件中。 – valtron 2013-03-22 06:51:06

+0

我应该在哪里定义send_update方法,我已经在models.py中提到 – user2086641 2013-03-22 06:56:13

相关问题