【问题标题】:Popup for inherited models of ManyToManyField targetManyToManyField 目标继承模型的弹出窗口
【发布时间】:2015-01-04 11:20:58
【问题描述】:

我有类似的应用和模型:

在“动物”应用中:

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 的创建表单(不是子类化它的模型) )。


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

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

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

(我知道可以单独添加BearLion,然后在为animals 选择Zoo 时选择这些对象,但我所要求的似乎更好的可用性)

【问题讨论】:

    标签: django python-2.7 django-admin


    【解决方案1】:

    覆盖AnimalAdminadd_view() 方法,如果从弹出窗口调用它,则显示带有可用物种列表的中间页面。

    只是概念证明:

    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>
    

    【讨论】:

    【解决方案2】:

    应该花更多时间在谷歌上搜索。

    我找到了https://django-polymorphic.readthedocs.org,它提供在管理界面中选择子模型等等:

    来自文档:

    • 添加屏幕获得了一个额外的步骤,其中所需的子模型 被选中。
    • 编辑屏幕显示管理界面 子模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多