【问题标题】:Django using custom signals to send mailDjango 使用自定义信号发送邮件
【发布时间】:2013-03-22 05:35:35
【问题描述】:

在我的示例中,信号函数是在 models.py 中创建的。而不是这个,我认为可以使用自定义信号概念。

我用于信号功能的 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 文件创建自定义信号来发送邮件。

我正在尝试在实践中学习这一点,一个例子将帮助我做到这一点。

谢谢

【问题讨论】:

  • 您的意思是要定义自己的信号,而不是使用pre_save

标签: django django-views django-signals


【解决方案1】:

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

【讨论】:

  • import signal give no module named signals how?
【解决方案2】:

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)

【讨论】:

  • 我们可以使用单独的 signals.py 文件来代替使用 models.py 来定义和连接信号。如果是这样,请指导我如何做
  • 您可以将该代码放入signals.py,它会起作用的。但是,我建议在 models.py 中使用 connecting 信号,因为应该在同一个文件中定义和连接接收。
  • 我应该在哪里定义我在 models.py 中已经提到的 send_update 方法
  • 我倾向于将接收器保存在我的models.py 中,因为这些文件总是由 Django 加载,然后我确信信号会被连接。如果它们变得太大,我将接收器保留在模型中,但将工作委托给我在 controllers.py 中定义的函数,您应该在其中存储与模型不严格相关的逻辑。
  • 我的想法是不要打扰models.py,而不是我必须在views.py或listeners.py中保留这个send_update函数,我对信号不太熟悉所以请帮忙我先生
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 2016-01-09
  • 2012-04-26
  • 2011-06-15
  • 2014-07-27
  • 2015-09-21
  • 2018-11-20
相关资源
最近更新 更多