2
def SiteAdminForm(model_cls, *args, **kwargs):
    class MerchantAdminForm(forms.ModelForm):
        class Meta:
            exclude = ('external_links', 'published', 'logo','image_zip_file',)
            model = model_cls

        def __init__(self, *args, **kwargs):
            super(MerchantAdminForm, self).__init__(*args, **kwargs)

    return MerchantAdminForm()

# In use...
merchant_form = SiteAdminForm(merchant.__class__, instance=merchant)

に何が渡されてmodel_clsも、モデルは常に無視されます。

Meta.excludeは正しく設定されていますが、どうすれば動的に更新できますMeta.modelか?

4

4 に答える 4

0

それはあなたmerchant.__class__もそうだからdjango.db.models.base.ModelBaseです。マーチャントを印刷しようとすると、適切なクラスパスが取得されます(私は取得しますapp.models.TestModel)が、クラスはBaseModelです。

それはメタクラスの使用によるものだと思います。おそらく、メタクラスはオブジェクトのクラスをModelBaseに設定します。DjangoはこのPython機能を広範に使用しており、これにより奇妙な動作が発生する可能性があります(つまり、私のように正確に取得できない人にとっては奇妙なことです;-)、動作しないというわけではありません)。djangoコードを見てみましょう-あなたもそうすべきです:-)

とにかく、あなたはあなたのフォームの中にあなたが望むものを手に入れます、そしてそれはうまくいくはずです:-)

DAMMIT

もちろん、私は知っています、なぜこれが起こっているのですか。あなたはクラスのクラスを求めています、あなたは知っています。form.Meta.modelの内部は、フォームに渡したクラスです。これがModelBaseを取得する理由です-メタクラスを取得します。

メタクラスはかっこいいので、読む価値があります。それらも少し複雑ですが;-)ここでそれらについて読むことができます。

于 2010-02-10T18:51:21.060 に答える
0

次のように使用してみてください。

merchant_form = SiteAdminForm(merchant.model, instance=merchant)

1 つの提案は、Python シェル (django の場合は ./manage.py シェル) を使用して、組み込みの dir() 関数でオブジェクトの属性とメソッドを検査することです。

于 2010-02-10T19:22:52.950 に答える
0

私はばかです、それで寝て、もう一度見て、すぐにそれを理解しました!!!!

return MerchantAdminForm()になるはずだった:return MerchantAdminForm(*args, **kwargs)

于 2010-02-11T08:49:01.627 に答える