1

models.py に ForeignKey BodyMaterial を持つ CarType があります。

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 に戻ると、関連する BodyMaterials のみが default_body_material のドロップダウンに表示されます。

ID で limit_choices_to を使用してフィルタリングしようとしています。オブジェクトのIDは実行時に決定されるため、post_initを使用してこれを行っています。

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

インラインのクエリセット関数をオーバーライドすることを検討したいと考えています。

于 2012-07-24T23:47:52.557 に答える
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 に答える