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 添加哪个子类模型?
或者有更好的方法来解决这个问题(内容类型?覆盖表单?)
如果可以避免,我宁愿不更改模型。
(我知道可以单独添加 Bear
或 Lion
,并且当 selecting animals
时仅 select 这些对象 Zoo
,但我要求的似乎在可用性方面更好)
重写 AnimalAdmin
的 add_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.
我有与这些类似的应用程序和模型:
在应用程序中 '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 添加哪个子类模型?
或者有更好的方法来解决这个问题(内容类型?覆盖表单?)
如果可以避免,我宁愿不更改模型。
(我知道可以单独添加 Bear
或 Lion
,并且当 selecting animals
时仅 select 这些对象 Zoo
,但我要求的似乎在可用性方面更好)
重写 AnimalAdmin
的 add_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.