按对象ID过滤ForeignKey

时间:2012-07-24 21:16:13

标签: django django-admin foreign-keys limit-choices-to

我有一个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)

我想过滤foreignKey的default_body_material只显示相关的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的原因(这可能是非常基本的)?

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

2 个答案:

答案 0 :(得分: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
    ...

答案 1 :(得分:0)

您希望查看覆盖内联的查询集功能。