2011-03-18 81 views
0

我有幾十個模型,每個模型都有一個關聯的ModelForm(其Meta.model指的是所討論的模型)。如何找到相關聯的Django ModelForm給定模型

E.g.

class FooModel(Model): 
    pass 

class FooModelForm(ModelForm): 
    class Meta: 
     model = FooModel 

# current approach using a classmethod 
FooModelForm.insert_in_model() # does cls.Meta.model.form = cls 

所以,很明顯,很容易找到給FooModelForm的FooModel。我想要的是知道進行REVERSE的最佳方式:當我使用FooModel或甚至字符串「Foo」時,找到FooModelForm。

假設只有一個的ModelForm每個模型,雖然返回多個解決方案的罰款。

我目前的做法是藏匿在窗體類模型(如上圖所示),但我想知道更好的方法特別是那些可以計算它集中(不高於最終線)。

編輯:我已經審覈之類的東西Django: Display Generic ModelForm or predefined form,但我相信這是一個較簡單的問題。 Django管理員代碼必須按照我所尋求的方式來做一些事情。但是get_model equivalent for ModelForms?暗示可能是巫術,並且最好只是做dict['Foo']=FooModelForm或其等價物以明確地跟蹤關聯。似乎重複。

+0

您可能會掃描項目中的所有ModelForm,以查找Model並返回其值,但是出於什麼目的?你目前的任務是明確的 - 比隱式更好。 – 2011-03-18 23:08:10

回答

1

如果你有20種以下的形式,聽起來像映射出一本字典是最簡單的方法。 Django也在內部也做這件事。

ModelForms,Django管理只是創建他們通過modelform_factory飛,所以沒有可比性方法get_model


我看,你的方法是防彈的,但需要在以往模型中的行DEF。

如果您只有一個ModelFormmodel,您可能會遍歷ModelForm子類,直到找到您的表單。當我提出 與FooModel甚至串 「富」

發現FooModelForm。

modelforms = forms.ModelForm.__subclasses__() 
def get_modelform(model): 
    try: 
     return filter(lambda x:x.Meta.model == model, modelforms)[0] 
    except IndexError: 
     print "apparently, there wasn't a ModelForm for your model" 

如果你想拉ModelForm作爲一個字符串,你需要確保兩個 app_label__name__是正確的,這意味着它會更容易在功能使用get_model('app', 'model')

你可以用你的方法結合這一點,並自動將您的模型指向它的ModelForm的屬性。

掛鉤應用頂部的class_prepared信號,找到相應的ModelForm並將其附加到您的Model類。 希望幫助或給你一些想法。

+0

謝謝,不知道class_prepared。 – grp 2011-03-22 01:11:04