Выражаю благодарность пользователю javedimka за участие и помощь в пояснении многих моментов. Так как я не люблю вопросы без ответов в интернете, то напишу его тут (благо, что javedimka разрешил).
Итак, лучшая практика решения такой проблемы —
не использовать Django Signals совсем. Особенно, когда есть встроенные методы, типа
ModelAdmin.response_add, и уйти из модели в
admin.py:
# ./app/utils.py
def send_mail_to_admin(obj):
hotels = obj.hotels.all().order_by('cost')
message = 'Тур ID ' + obj.pk + '\n'
message += 'Страна: ' + obj.country_name + ' Город: ' + obj.country_name + '\n'
message += 'Отели: \n'
for hotel in hotels:
message += hotel.name + ' ' + hotel.star + ' ' + hotel.cost + ' руб. \n'
send_mail(
'From Admin',
message,
'no-reply@example.com',
['admin@example.com'],
fail_silently=False,
)
# ./app/admin.py
from .utils import send_mail_to_admin
class ToursAdmin(admin.ModelAdmin):
exclude = ('created_at',)
list_display = ('country',)
ordering = ('created_at',)
inlines = (HotelsInline,)
def response_add(self, request, obj, post_url_continue=None):
send_mail_to_admin(obj)
return super().response_add(request, obj, post_url_continue)