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

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

    return DynamoForm


form_set = get_form(ActualModel)(request.POST)

那是你要的吗 ?

于 2013-12-20T12:28:06.430 回答
0

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

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

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

该死

我当然知道,为什么会这样。你在问一个班级的班级,你知道的。form.Meta.model 内部是一个类,是您传递给表单的类。这就是你得到 ModelBase 的原因——你得到了元类。

元类值得一读,因为它们很酷。虽然它们也有点复杂 ;-)在这里你可以了解它们。

于 2010-02-10T18:51:21.060 回答
0

尝试像这样使用:

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

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

于 2010-02-10T19:22:52.950 回答
0

我是个白痴,睡在上面,再看一遍,几乎立刻就明白了!!!!

return MerchantAdminForm()本来应该:return MerchantAdminForm(*args, **kwargs)

于 2010-02-11T08:49:01.627 回答