ManyToManyField 目标的继承模型的弹出窗口

Popup for inherited models of ManyToManyField target

我有与这些类似的应用程序和模型:

在应用程序中 'Animals':

class Animal(models.Model):
    name = models.CharField()

class Lion(Animal):
    roar_loudness_decibel = models.IntegerField()

class Bear(Animal):
    salmons_eaten = models.IntegerField()

# And many more that inherit Animal

在应用动物园中:

from Animal.models import Animal

class Zoo(models.Model):
    animals = models.ManyToManyField(Animal)

在Django管理界面,我已经注册了所有的应用模型。

每当我创建 Zoo 并想以相同的形式添加 animals 时(单击绿色加号按钮并弹出窗口),我都会得到 Animal 的创建形式(不是对其进行子分类的模型)。


有什么方法可以select为 ManyToManyField 添加哪个子类模型?

或者有更好的方法来解决这个问题(内容类型?覆盖表单?)

如果可以避免,我宁愿不更改模型。

(我知道可以单独添加 BearLion,并且当 selecting animals 时仅 select 这些对象 Zoo,但我要求的似乎在可用性方面更好)

重写 AnimalAdminadd_view() 方法,如果它是从弹出窗口调用的 window 然后显示包含可用物种列表的中间页面。

只是概念验证:

admin.py

class AnimalAdmin(admin.ModelAdmin):

    def add_view(self, request, form_url='', extra_context=None):

        if request.method == 'GET' and '_popup' in request.GET:
            return render(request, 'admin/animals/choose_animal.html')

        return super(AnimalAdmin, self).add_view(request, form_url,
                                                 extra_context)

templates/admin/animals/choose_animal.html

<body>

    Choose an animal:

    <ul>
        <li><a href="{% url 'admin:app_lion_add' %}?_popup=1">Lion</a></li>
        <li><a href="{% url 'admin:app_bear_add' %}?_popup=1">Bear</a></li>
    </ul>

</body>

本应为此花更多时间进行谷歌搜索。

我发现 https://django-polymorphic.readthedocs.org 可以在管理界面中选择子模型以及更多:

来自文档:

  • The add screen gains an additional step where the desired child model is selected.
  • The edit screen displays the admin interface of the child model.