2017-11-19 1 views
0

私はDjango(1.11.7)とSignalsを使用して、新しく保存されたモデル(モデルからの情報を元にしてメールにメッセージを送信します)を実行します。しかし、私はこのモデルにもう1つだけを追加し、メイン(inlines=[...]admin.py)と接続(ForeignKey) - メインモデルのインスタンスの保存には参加しません。post_saveインスタンス(Django Signals)でインラインモデルを取得する方法は?

私のモデルは次のとおりです。私は再びこのレコードを編集するまで

# /tours/models.py 

class Tours(models.Model): 
    country = models.CharField(...) 
    ... 


class ToursHotels(models.Model): 
    tour = models.ForeignKey(Tours, ...) 
    cost = models.IntegerField(...) 
    ... 


@receiver(post_save, sender=Tours) 
def do_something(sender, **kwargs): 
    tour = Tours.objects.get(id=kwargs.get('instance').id) 
    hotels = ToursHotels.objects.filter(tour_id=tour.id).order_by('cost') 
    ... 

ので、hotelsは空になります。 それをより良くするには?お願い助けて。

答えて

0

したがって、Django Signalsを使用しないことをお勧めします。特に、ModelAdmin.response_addなどの組み込みメソッドがあり、モデルからadmin.pyに移動する場合:

# ./app/utils.py 

def send_mail_to_admin(obj): 
    hotels = obj.hotels.all().order_by('cost') 

    message = 'Tour ID ' + obj.pk + '\n' 
    message += 'Country: ' + obj.country_name + ' City: ' + obj.city_name + '\n' 
    message += 'Hotels: \n' 
    for hotel in hotels: 
     message += hotel.name + ' ' + hotel.star + ' ' + hotel.cost + '\n' 

    send_mail(
     'From Admin', 
     message, 
     '[email protected]', 
     ['[email protected]'], 
     fail_silently=False, 
    ) 

# ./app/admin.py 

from .utils import send_mail_to_admin 


class ToursAdmin(admin.ModelAdmin): 
    exclude = ('created_at',) 
    list_display = ('country_name',) 
    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) 
関連する問題