Python 如何基于通过Django生成的新主键发送电子邮件?
我想在Django中生成新的主键时向用户发送一封电子邮件。模型中的我的代码。py:Python 如何基于通过Django生成的新主键发送电子邮件?,python,django,email,key,Python,Django,Email,Key,我想在Django中生成新的主键时向用户发送一封电子邮件。模型中的我的代码。py: class PurchaseOrder(models.Model): product = models.CharField(max_length=256) vendor = models.CharField(max_length=256) dollar_amount = models.FloatField() item_number = models.AutoField(prima
class PurchaseOrder(models.Model):
product = models.CharField(max_length=256)
vendor = models.CharField(max_length=256)
dollar_amount = models.FloatField()
item_number = models.AutoField(primary_key=True)
我已将其编码到每次刷新页面时都可以发送电子邮件的位置
email = EmailMessage('Purchase Order System', 'your message here', to=['youremail@gmail.com'])
email.send()
但是我如何使它能够在每次生成新主键时发送电子邮件?收听
post\u save
信号
from django.db.models import signals
from django.dispatch import receiver
@receiver(signals.post_save, sender=PurchaseOrder)
def email_handler(sender, **kwargs):
if kwargs['created']:
email = EmailMessage('Purchase Order System', 'your message here', to=['youremail@gmail.com'])
email.send()
或者在模型中定义自定义保存方法
class PurchaseOrder(models.Model):
def save(self, *args, **kwargs):
# Check if this is a new key
if not self.pk:
email = EmailMessage('Purchase Order System', 'your message here', to=['youremail@gmail.com'])
email.send()
super(PurchaseOrder, self).save(*args, **kwargs)
使用
您必须将此代码粘贴到加载django期间将执行的某个位置,例如models.py
示例models.py
:
from django.core.mail import EmailMessage
from django.db import models
from django.db.models import signals
class PurchaseOrder(models.Model):
product = models.CharField(max_length=256)
vendor = models.CharField(max_length=256)
dollar_amount = models.FloatField()
item_number = models.AutoField(primary_key=True)
def send_email_on_new_order(instance, created, raw, **kwargs):
# Fixtures or updates are not interesting.
if not created or raw:
return
# `instance` is your PurchaseOrder instance.
email = EmailMessage('Purchase Order System', 'your message here', to=['youremail@gmail.com'])
email.send()
signals.post_save.connect(send_email_on_new_order, sender=PurchaseOrder, dispatch_uid='send_email_on_new_order')
@voithos是正确的,这是一个自定义保存是解决问题的好方法。然而,根据对这个问题的严格回答,从技术上讲,电子邮件是在主键创建之前发送的。这可能无关紧要,但如果有,我会按如下顺序排列代码:
def save(self, *args, **kwargs):
email = False # Don't email by default
# Check if this is a new key
if not self.pk:
email = EmailMessage('Purchase Order System', 'your message here', to=['youremail@gmail.com'])
super(PurchaseOrder, self).save(*args, **kwargs)
if email: # Email was created, and we have a new Primary Key, so send now.
email.send()
注意:如果您需要一种方法来引用新创建的实例(例如,电子邮件需要包含一个包含刚创建的主键的链接),我个人会使用@kroolik提供的信号方法。我收到一个错误,说“NameError:name'PurchaseOrder'未定义”,如果这是一个糟糕的问题,我很抱歉,因为我对Python和Django都是新手。请将Django.db.models中的放入models.py
文件的顶部,同时将PurchaseOrder
定义下面的其余代码导入。检查我的答案以供参考。
def save(self, *args, **kwargs):
email = False # Don't email by default
# Check if this is a new key
if not self.pk:
email = EmailMessage('Purchase Order System', 'your message here', to=['youremail@gmail.com'])
super(PurchaseOrder, self).save(*args, **kwargs)
if email: # Email was created, and we have a new Primary Key, so send now.
email.send()