如何在给定模型的情况下找到关联的Django ModelForm

时间:2011-03-18 22:38:17

标签: django django-models django-forms

我有几十个模型,每个模型都有一个关联的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或其等价物来明确跟踪关联。似乎是重复的。

1 个答案:

答案 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类。 希望有助于或给你一些想法。