1

我有一个 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(这可能是非常基本的)?

请注意,此问题仅适用于管理界面。

4

2 回答 2

0

只需使用自定义ModelForm

class CarTypeAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(CarTypeAdminForm, self).__init__(*args, **kwargs)
        # Can't limit it until instance has been saved at least once
        if self.instance.pk:
            self.fields['default_body_material'].queryset = \
                self.fields['default_body_material'].queryset \
                    .filter(location=self.instance)

class CarTypeAdmin(admin.ModelAdmin):
    form = CarTypeAdminForm
    ...
于 2012-07-24T23:05:42.950 回答
0

您想查看为您的内联覆盖查询集函数。

于 2012-07-24T23:47:52.557 回答