Would like to ask for help on how to send an email. So I have basic tracking application for a logistics app. When I add a new entry(name,email,phone number,tracking number,cargo received date..) in my database in django admin or update the database (update cargo received date..),I want it to send an email to the client's email address for an update.
My models.py is
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, max_length=255,blank=True)
arrived_at_region_date = models.DateField(null=True, blank=True)
arrived_at_region_details = models.CharField(null=True, max_length=255,blank=True)
departed_shipping_facility_date = models.DateField(null=True, blank=True)
departed_shipping_facility_details = models.CharField(null=True, max_length=255,blank=True)
cargo_delivered_date = models.DateField(null=True, blank=True)
cargo_delivered_details = models.CharField(null=True, max_length=255,blank=True)
class Meta:
verbose_name_plural = "Italy"
def save(self, *args, **kwargs):
return super(Tracking2, self).save(*args, **kwargs)
My admin.py is
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)
Can someone advise on what should I add to have my app sends an update when there is a new entry or update?
Thank you.
Use the Django signal post_save
and describe there the logic you want.
@receiver(post_save, sender= Tracking2)
def send_tracking_email(sender, instance, **kwargs):
send_email() # this is your function to send email
The instance
here is the saved Tracking2
instance, so you can use it for building the email's data.
Read more here: https://docs.djangoproject.com/en/3.1/ref/signals/
UPD: One more thing, if you need to send the email for new instances only, then add the following condition:
@receiver(post_save, sender= Tracking2)
def send_tracking_email(sender, instance, created, **kwargs):
if created:
send_email() # this is your function to send email