问题:如何在 Django 中使用 DeleteView 显示相关项目?

我正在做一个视图来删除(使用来自 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

解答

您可以使用 Django 使用的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 包有一个名为[NestedObjectsCollector子类,它的工作方式相同,但有一个返回分层列表的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

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐