如何从通过PolymorphicChildModelAdmin创建的表单中排除字段

frl*_*lan 5 python django django-polymorphic

使用Polymorphic和其他插件玩一下我想知道如何防止某些基类字段显示在子管理界面的表单内部.为我的子类创建此adminy.py:

from django.contrib import admin
from .models import *
from partsmanagement.models import Part
from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin

admin.site.register(Book)

class BookAdmin(PolymorphicChildModelAdmin):
    base_model = Part
Run Code Online (Sandbox Code Playgroud)

以及基本模型的admin.py:

# -*- coding: utf-8 -*-

from django.contrib import admin
from .models import *
from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin
from bookcollection.models import Book
from bookcollection.admin import BookAdmin

admin.site.register(Part)

class PartAdmin(PolymorphicParentModelAdmin):
    base_model = 'Part'
    child_models = (
        (Book, BookAdmin),
    )
Run Code Online (Sandbox Code Playgroud)

现在,admin中的表单显示了base和child类的所有文件.我试图为子类添加exclude = list()但这不起作用(没有更改).

Val*_*yov 0

过滤类(相当于 python 的 isinstance() ):

>>> ModelA.objects.instance_of(ModelB)
.
[ <ModelB: id 2, field1 (CharField), field2 (CharField)>,
  <ModelC: id 3, field1 (CharField), field2 (CharField), field3 (CharField)> ]
Run Code Online (Sandbox Code Playgroud)

一般来说,包含或排除继承树的部分内容:

ModelA.objects.instance_of(ModelB [, ModelC ...])
ModelA.objects.not_instance_of(ModelB [, ModelC ...])
Run Code Online (Sandbox Code Playgroud)

您还可以在 Q-objects 中使用此功能(结果与上面相同):

>>> ModelA.objects.filter( Q(instance_of=ModelB) )
Run Code Online (Sandbox Code Playgroud)

多态过滤(针对派生类中的字段)

例如,使用 Q 对象(语法:精确模型名称 + 三个 _ + 字段名称)从继承树中任意位置的多个派生类中挑选对象:

>>> ModelA.objects.filter(  Q(ModelB___field2 = 'B2') | Q(ModelC___field3 = 'C3')  )
.
[ <ModelB: id 2, field1 (CharField), field2 (CharField)>,
  <ModelC: id 3, field1 (CharField), field2 (CharField), field3 (CharField)> ]
Run Code Online (Sandbox Code Playgroud)

组合查询集

查询集现在可以被视为允许聚合不同对象类型的对象容器,与 python 列表非常相似 - 只要通过公共基类的管理器访问对象即可:

>>> Base.objects.instance_of(ModelX) | Base.objects.instance_of(ModelY)
.
[ <ModelX: id 1, field_x (CharField)>,
  <ModelY: id 2, field_y (CharField)> ]
Run Code Online (Sandbox Code Playgroud)