Search code examples
djangoemaildjango-admindjango-email

Django Admin send email upon new entry or update on models


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.


Solution

  • 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