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
?
答案 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)