たとえば、通常のビューから来るpost_saveと管理者からのpost_saveを区別するにはどうすればよいですか?adminからのDjangoシグナル
答えて
これを行うための簡単な方法はありません。これは、post_save信号を使用してコードを適切な場所に配置しない可能性があることを意味します。あなたが本当にしたいのであれば、スレッドローカルハックを使ってリクエストオブジェクトにアクセスし、現在実行中のビューが管理者ビューであるかどうかを知ることができます。スレッドローカルハッキングを行う方法については、django cookbookで開始しますが、ユーザーの代わりにリクエスト全体を保存するだけです。多くの人が、スレッドローカルハックは嫌なことだと考えています。ここにはdiscussionがあります。私は彼らにはとても便利な場所があると思いますが、それ以上のことが分からなければ、あなたにはもっと良い解決策があると思います。
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)
- 1. Django Admin
- 2. Django admin url.py
- 3. Django admin list_filter duplicate
- 4. Django Embed Admin Form
- 5. Django - Admin - Mandatory Inlines
- 6. django admin action
- 7. Django admin list_display newline
- 8. Django admin exclude filter
- 9. Django admin GenericForeignKey inline
- 10. Django Admin escaping text
なぜ知りたいですか? –