动态更新ModelForm的Meta类模型字段

时间:2010-02-10 17:47:51

标签: python django dynamic model modelform

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 个答案:

答案 0 :(得分:1)

def get_form(model_class):
    class DynamoForm(forms.ModelForm):
        class Meta:
            model = model_class

    return DynamoForm


form_set = get_form(ActualModel)(request.POST)

是你想要的吗?

答案 1 :(得分:0)

那是因为您的merchant.__class__也是django.db.models.base.ModelBase。如果您只是尝试打印商家,那么您将获得正确的课程路径(我得到app.models.TestModel),但是BaseModel。

我认为这是因为使用了元类。可能是元类将对象的类设置为ModelBase。 Django广泛使用这个python功能,这可能会导致一些奇怪的行为(这对人们来说很奇怪,不像我一样得到它;-),而不是它不起作用)。我将尝试看一下django代码 - 你也应该: - )

无论如何,你在表单中得到你想要的东西,它应该可以正常工作: - )

<强>该死

我当然知道,为什么会这样。你知道,你要求上课。里面的form.Meta.model是一个类,你传递给表单的那个。这就是你得到ModelBase的原因 - 你得到了元类。

值得一读的是元类,因为它们很酷。虽然它们也有点复杂;-) Here你可以阅读它们。

答案 2 :(得分:0)

尝试这样使用:

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

一个建议是使用Python shell(在django case,。/ manage.py shell中)使用内置的dir()函数检查对象的属性和方法。

答案 3 :(得分:0)

我是个白痴,睡在上面,再次看着它,几乎立刻想出来!!!!

return MerchantAdminForm()应该是:return MerchantAdminForm(*args, **kwargs)