Django管理员在输入新内容或更新模型后会发送电子邮件

问题描述

想寻求有关如何发送电子邮件的帮助。所以我有一个物流应用程序的基本跟踪应用程序。当我在django admin中的数据库添加新条目(名称,电子邮件,电话号码,跟踪号码,收货日期..)或更新数据库(更新收货日期..)时,我希望它发送电子邮件至客户的电子邮件地址以进行更新。

我的models.py是

class Tracking2(models.Model):
MODE_CHOICES = (
    ('Air Freight','Air Freight'),('Sea Freight','Sea Freight'),)

name = models.CharField(max_length=255)
contact_number = models.CharField(max_length=255)
email_address = models.CharField(max_length=150,default='Email Address')
mode = models.CharField(max_length=255,choices=MODE_CHOICES)
tracking_number = models.CharField(max_length=255)
cargo_received_date = models.DateField(null=True,blank=True)
cargo_received_details = models.CharField(null=True,max_length=255,blank=True)
out_for_delivery_date = models.DateField(null=True,blank=True)
out_for_delivery_details = models.CharField(null=True,blank=True)
arrived_at_region_date = models.DateField(null=True,blank=True)
arrived_at_region_details = models.CharField(null=True,blank=True)
departed_shipping_facility_date = models.DateField(null=True,blank=True)
departed_shipping_facility_details = models.CharField(null=True,blank=True)
cargo_delivered_date = models.DateField(null=True,blank=True)
cargo_delivered_details = models.CharField(null=True,blank=True)

class Meta:
       verbose_name_plural = "Italy"


def save(self,*args,**kwargs):
    return super(Tracking2,self).save(*args,**kwargs)

我的admin.py是

 from daterange_filter.filter import DaterangeFilter
from django.contrib import admin
from .models import Tracking2
from import_export import resources
from import_export.admin import ImportExportModelAdmin
from rangefilter.filter import DaterangeFilter,DateTimeRangeFilter


    
class Tracking2Resources(resources.ModelResource):
    class Meta:
        model = Tracking2

class Tracking2Admin(ImportExportModelAdmin):
    resource_class= Tracking2Resources
    search_fields = ('name','contact_number','tracking_number','out_for_delivery_details' )
    list_display = ("name","contact_number","mode","tracking_number","cargo_received_date","cargo_received_details","out_for_delivery_date","out_for_delivery_details","arrived_at_region_date","arrived_at_region_details","departed_shipping_facility_date","departed_shipping_facility_details","cargo_delivered_date","cargo_delivered_details")
    list_filter = (
        ("cargo_received_date",DaterangeFilter),'mode'
    )
admin.site.register(Tracking2,Tracking2Admin)

有人可以建议我在添加新条目或更新时应添加什么以使我的应用发送更新吗?

谢谢。

解决方法

使用Django信号post_save并在其中描述所需的逻辑。

@receiver(post_save,sender= Tracking2)
def send_tracking_email(sender,instance,**kwargs):
    send_email() # this is your function to send email

此处的instance是已保存的Tracking2实例,因此您可以使用它来构建电子邮件的数据。 在此处阅读更多信息:https://docs.djangoproject.com/en/3.1/ref/signals/

UPD: 还有一件事,如果您只需要发送新实例的电子邮件,则添加以下条件:

@receiver(post_save,created,**kwargs):
    if created:
        send_email() # this is your function to send email