2013-01-10 83 views
2

我正在使用信号发送邮件,并且工作正常(现在我正在测试它并提供静态电子邮件地址)。但我想在我的邮件功能中使用模型字段的动态值。django中的信号问题

例如如果管理员在该模型中更改了管理仪表板中的任何内容,则会使用post_save调用信号,并且会调用邮件功能。但是我需要这个模型的用户id,这样我才能从auth_user表中获取他的名字email_address。

我在post_save中发送模型的名称,但如果可能的话,我不知道如何在信号中使用它们的字段。

现在我正在使用此代码。

我的模型

class ABC(models.Model): 
    ..... 
    ....... 

post_save.connect(handlers.model_saved, sender=ABC) 

这就是所谓的信号。

from django.core.mail import send_mail 


def model_saved(sender, **kwargs): 
    send_mail('Subject here', 'Here is the message.', '[email protected]', 
    ['[email protected]'], fail_silently=False) 
    print "SAVED",sender,kwargs 

终端响应

<class 'XYZ.models.ABC'> {'raw': False, 'instance': <ABC: #1 admin admin 2013-01-04 04:20:50+00:00>, 'signal': <django.dispatch.dispatcher.Signal object at 0xb612584c>, 'using': 'default', 'created': False} 

请建议我一些方法,使我可以在信号使用我的模型领域的瓦莱斯。

谢谢。

回答

3

instance参数提供给保存Model对象的信号处理程序。 所以,你可以使用它作为:

def model_saved(sender, **kwargs): 
    send_mail('Subject here', 'Here is the message.', '[email protected]', 
    ['[email protected]'], fail_silently=False) 
    abc_obj = kwargs['instance'] 
    #can use fields as 
    #abc_obj.somefield 
    print "SAVED",sender,kwargs 

post_save documentation解释这一点。

+0

感谢您的回复,让我试试这个! – Inforian

+0

是的,它工作!非常感谢 – Inforian

+0

我们可以在handler.py中调用视图函数,因为当我试图在handler.py中导入我的视图时,它会给我提供内部服务器错误。 – Inforian