我有几十个模型,每个模型都有一个关联的ModelForm(其Meta.model引用了相关模型)。
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 :(得分:1)
如果你有不到20个表格,那么映射字典的声音是最简单的方法。 Django也在内部做这件事。
对于ModelForms
,django管理员只需通过modelform_factory
动态创建它们,因此没有与get_model
我确实看到,你的方法是防弹的,但是需要在模型def中使用一行。
如果每ModelForm
只有一个model
,则可能会迭代ModelForm
子类,直到找到您的表单。
当我出现时找到FooModelForm 用FooModel甚至是字符串 “foo” 的。
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类。
希望有助于或给你一些想法。