2011-03-14 8 views
1

たとえば、通常のビューから来るpost_saveと管理者からのpost_saveを区別するにはどうすればよいですか?adminからのDjangoシグナル

+0

なぜ知りたいですか? –

答えて

2

これを行うための簡単な方法はありません。これは、post_save信号を使用してコードを適切な場所に配置しない可能性があることを意味します。あなたが本当にしたいのであれば、スレッドローカルハックを使ってリクエストオブジェクトにアクセスし、現在実行中のビューが管理者ビューであるかどうかを知ることができます。スレッドローカルハッキングを行う方法については、django cookbookで開始しますが、ユーザーの代わりにリクエスト全体を保存するだけです。多くの人が、スレッドローカルハックは嫌なことだと考えています。ここにはdiscussionがあります。私は彼らにはとても便利な場所があると思いますが、それ以上のことが分からなければ、あなたにはもっと良い解決策があると思います。

2

ModelAdmin.response_addをオーバーライドすると、django管理者がシグナルを送信していないように見えるので、同様の機能が得られる可能性があります。

response_add関数は、関連フィールドやオブジェクト自体などのすべてのデータを検証して追加した後に呼び出されます。

私たち自身のModelAdminクラスでresponse_addメソッドをオーバーライドすると、管理者の何かが正常に追加された後にコードを実行できますが、他の場所では実行されません。

私はdjango 1.4で次のようにしました。コメントやフィードバックは非常に高く評価されました!私の場合はうまくいっているようですが、私はDjangoのすべての内部構造に慣れていません。しかし、それは私にとってスレッドローカルのハックよりも良いと思う。

サイドノート:ModelAdminをオーバーライドして自分自身で信号を鳴らすことはできますが、それを経験することはできません。

これはproduct_get_initial_infoを実行する私はresponse_add上書きするために使用されるコード、(obj.id)のみの製品が正常にadminに追加されました:

class ProductAdmin(admin.ModelAdmin): 
    prepopulated_fields = {"slug": ("title",)} 
    inlines = [ 
     ProductInline, 
    ] 
    def response_add(self, request, obj, post_url_continue='../%s/'): 
     if obj and obj.id: 
      tasks.product_get_initial_info(obj.id) 
     return super(ProductAdmin, self).response_add(request, obj, post_url_continue='../%s/') 

関連Djangoのソースコードはここにある: django/contrib/admin/options.py

class ModelAdmin(BaseModelAdmin): 
    def add_view(self, request,...) 
     # .... Many lines of code ...... not putting them here as they're not so relevant 
     if all_valid(formsets) and form_validated: 
      self.save_model(request, new_object, form, False) 
      self.save_related(request, form, formsets, False) 
      self.log_addition(request, new_object) 
      # After saving everything response_add gets called with the newly created object 
      return self.response_add(request, new_object)