2010-02-10 61 views
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的是什麼,模型總是被忽略。動態更新ModelForm的Meta類模型字段

Meta.exclude設置正確,我該如何動態更新Meta.model

回答

0

這是因爲你的merchant.__class__也是django.db.models.base.ModelBase。如果您只是嘗試打印商家,那麼您將獲得正確的課程路徑(我得到app.models.TestModel),但是BaseModel。

我認爲這是因爲元類的使用。元類可能會將對象的類設置爲ModelBase。 Django廣泛地使用這個python特性,這可能會導致一些奇怪的行爲(這對於人來說意味着奇怪,並不像它那樣完美);而不是它不起作用)。我會嘗試看看Django的代碼 - 你應該太:-)

無論如何,你得到你想要的表單裏面是什麼,它應該只是罰款:-)

該死

當然我知道,爲什麼會發生這種情況。你知道,你在問班級。裏面的form.Meta.model是一個類,是你傳入表單的類。這就是你得到ModelBase的原因 - 你得到了元類。

它值得關於元類的閱讀,因爲它們很酷。雖然它們也有點複雜;-) Here你可以閱讀它們。

0

嘗試使用這樣的:

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

一個建議是使用Python殼(在Django情況下,./manage.py殼)檢查與屬性和一個對象的方法的內置dir()函數。

0

我是個白癡,睡在上面,又看了一遍,幾乎馬上就知道了!

return MerchantAdminForm()應該是:return MerchantAdminForm(*args, **kwargs)

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

    return DynamoForm 


form_set = get_form(ActualModel)(request.POST) 

是你想要的嗎?