我有一个 CarType,在我的 models.py 中有一个 ForeignKey BodyMaterial:
class BodyMaterial(models.Model):
location = models.ForeignKey('CarType')
name = models.CharField(max_length=255)
class CarType(models.Model):
name = models.CharField(max_length=255)
default_body_material = models.ForeignKey(BodyMaterial, null = True, blank = True, default = "", limit_choices_to={'location__exact': 1})
BodyMaterial 是我的 admin.py 中 CarType 中的内联:
class BodyMaterial_Inline(admin.StackedInline):
model = BodyMaterial
extra = 1
class CarType_Admin(admin.ModelAdmin):
inlines = [BodyMaterial_Inline]
admin.site.register(CarType, CarType_Admin)
我想过滤 default_body_material 的 ForeignKey 以仅显示相关的 BodyMaterials(出现/添加在同一管理页面上的那些)。例如,我创建了一个 2 座 CarType,并在同一页面中添加了一些 BodyMaterials。然后我创建了一个 SVU CarType 和一些其他的 BodyMaterials。当我回到 2 座 CarType 时,我只想在 default_body_material 的下拉菜单中看到相关的 BodyMaterials。
我尝试在 id 上使用 limit_choices_to 进行过滤。所以我使用 post_init 这样做是因为对象的 id 在运行时确定:
def setID(**kwargs):
instance = kwargs.get('instance')
default_body_material = instance._meta.get_field_by_name('default_body_material')[0]
default_body_material.limit_choices_to = {'location__exact': instance.id}
post_init.connect(setID, CarType)
不幸的是,这无济于事。我错过了什么?是否有更好的理由为我的目的过滤 ForeignKey(这可能是非常基本的)?
请注意,此问题仅适用于管理界面。