2016-07-02 7 views
0

私がモデルを保存した後に私自身の関数def do_stuff()を呼び出す必要があるとしましょう。そのモデルが私が作成したアプリにあれば問題ありません。私は何ができる:djangoがインストールされているアプリのモデルの保存方法

def save(self, *args, **kwargs): 
     super(Post, self).save(*args, **kwargs) 
     do_stuff() 

しかし、私は、モデルを保存するときにサードパーティのアプリでsave()を呼び出す必要があります。すべてのプロジェクトを自分のローカルディレクトリにコピーしてsave()メソッドを追加することしか考えられませんが、すべてのアプリケーションコードをコピーする必要があるので、これはうまくありません。これを行うにはより良い方法がありますか?

EDITED:

apps.py:

from django.apps import AppConfig 

class SubscriptionConfig(AppConfig): 

    def ready(self): 
     import subscription.signals 

signals.py:

from django.db.models.signals import post_save 
from django.dispatch import receiver 

from djangocms_blog.models import Post 

@receiver(post_save, sender=Post) 
def send_emails(instance, **kwargs): 
    print 'instance %s' %instance 

__init__.py:

default_app_config = 'subscription.apps.SubscriptionConfig' 
+0

あなたのプロジェクト(あなたの 'settings.py'があるディレクトリ)の名前は' djangocms_blog'か 'subscription'ですか? –

+0

も、 'settings.py'は別のフォルダにありません。 'myprocject/myapp'の –

答えて

2

特定のイベントの後にディスパッチされる信号があります。そのうちの1つ、post_save(またはオブジェクトが保存される直前に何かしたい場合はpre_save)は、あなたのケースでは機能します。

、より具体的に、アプリのフォルダにsignals.pyを作成するには:

from django.db.models.signals import post_save 
from django.dispatch import receiver 

from your_project.your_app.models import YourModel 

@receiver(post_save, sender=YourModel) 
def do_stuff(instance, **kwargs): 
    # instance here is your object, you can use or modify it 
    instance.title = "New title" 

    # don't forget to save your object if you edit 
    instance.save() 

そして、このsignals.pyはどこかに輸入されていることを確認します。アプリケーションのapps.pyでそれを行うことをお勧めします。

from django.apps import AppConfig 


class YourAppConfig(AppConfig): 
    name = 'your_projects.your_app' 
    verbose_name = "Your app's verbose name" 

    def ready(self): 
     from your_project.your_app import signals 

として最後のステップは、必ずあなたのアプリは、あなたがそこに定義されたAppConfigを使用します。オープンアプリの__init__.pyとはこれを置く:今すぐ

default_app_config = 'your_projects.your_app.apps.YourAppConfig' 

、あなたがディスパッチを選択した信号が、あなたのハンドラ関数が実行されるたびに。

+0

は' signals.py'と 'apps.py'ファイルを作成し、' __init __。py'を修正しましたが、これらのファイルはコンパイルされません。 –

+0

それを推測するのは難しいです。これらのファイルの内容を質問に追加してください。 –

+0

編集した質問。 –

0

あなたはpost_save信号を使用することができます。モデル保存後に呼び出されます。

関連する問題