27

モデルからインスタンスを (Django のジェネリック ビュー DeleteView を使用して) 削除するビューを実行していますが、他のモデルからインスタンスをカスケードして削除します。

url(r'^person/(?P<pk>\d+)/delete/$', login_required(DeleteView.as_view(model=Person, success_url='/person/', template_name='delete.html')), name='person_delete'),

私がやりたいことは、管理インターフェイスが行うように、削除される関連アイテムのリストを表示することです:

Are you sure you are going to delete Person NAMEOFTHEPERSON?
By deleting it, you are also going to delete:
CLASSNAME1: CLASSOBJECT1 ; CLASSNAME2: CLASSOBJECT2 ; CLASSNAME3: CLASSOBJECT3 ; etc
4

2 に答える 2

52

CollectorDjangoが使用するクラスを使用して、カスケードで削除するオブジェクトを決定できます。collectインスタンス化してから、削除するオブジェクトを渡して呼び出します。リストまたはクエリセットを想定しているため、オブジェクトが 1 つしかない場合は、リスト内に配置します。

from django.db.models.deletion import Collector

collector = Collector(using='default') # or specific database
collector.collect([some_instance])
for model, instance in collector.instances_with_model():
    # do something

instances_with_modelジェネレーターを返すため、ループのコンテキスト内でのみ使用できます。操作できる実際のデータ構造を好む場合、admincontrib パッケージには というCollectorサブクラスNestedObjectsがあり、同じように機能nestedしますが、階層リストを返すメソッドがあります。

from django.contrib.admin.utils import NestedObjects

collector = NestedObjects(using='default') # or specific database
collector.collect([some_instance])
to_delete = collector.nested()

更新: Django 1.9 以降、django.contrib.admin.utilはdjango.contrib.admin.utilsに名前が変更されました

于 2012-08-28T15:29:21.473 に答える