我有一个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的原因(这可能是非常基本的)?
请注意,此问题仅适用于管理界面。
答案 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)
您希望查看覆盖内联的查询集功能。