我正在做一个视图(使用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
你可以使用Collector Django 使用的类来确定要在级联中删除的对象。实例化它,然后调用collect它传递要删除的对象。它需要一个列表或查询集,因此,如果只有一个对象,只需将其放在列表中:
Collector
collect
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