![](/img/trans.png)
[英]How can I send an email with the data posted on a class-based form in Django
[英]How can I send an email based on a new primary key being generated through Django?
我想在Django中生成新的主键时向用户发送电子邮件。 我在Models.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(primary_key=True)
我已将其编码为每次刷新页面时都可以发送电子邮件的位置
email = EmailMessage('Purchase Order System', 'your message here', to=['youremail@gmail.com'])
email.send()
但是我该如何做,以便每次生成新的主键时都发送电子邮件?
使用django信号 。
from django.db.models import signals
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')
您必须将此代码粘贴到将在加载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')
收听post_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()
或在模型中定义自定义save
方法。
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)
@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提供的信号方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.