1

我有以下模型及其形式:

class Project(models.Model)

class ProjectForm(forms.ModelForm)
    class Meta:
        Model = Project

所以很容易通过实例化来创建表单:

form = ProjectForm()

但就我而言,除了“项目”之外,我还有几个模型,而且我事先不知道我需要为这些模型中的哪一个来创建表单。

所以我想从 Project 模型的 ContentType 实例创建表单。

换句话说,我正在寻找类似的东西:

myproject = Project()
form = createform(myproject.ContentType)
4

3 回答 3

3

大概你有一些可能使用的模型的有限选择。最简单的方法是为它们中的每一个创建表单类,然后从字典中选择你需要的:

MODEL_FORMS = {
    MyModel: MyModelForm,
    MyOtherModel: MyOtherModelForm
}

my_form_class = MODEL_FORMS[my_project.content_type]
my_form = my_form_class()
于 2011-01-06T16:31:37.687 回答
1

不幸的是,这是我能找到的最好的——但是get_modelform_for_model的组合应该可以解决问题。您需要使用get_model加载要处理的模型类型,然后form_for_model获取该模型的表单。

编辑:如果你知道你正在处理什么模型,丹尼尔的解决方案会更好。

于 2011-01-06T16:07:05.510 回答
1

谢谢你们两位,这有很大帮助!

我会选择 Daniel 的解决方案,因为我的模型数量有限。

我想也许我需要将 model_class() 添加到“my_project.content_type.model_class()”以获得模型类(待检查)?

只是为了记录,我已经设法使用模型表单集工厂进行了一些工作:

from django.forms.models import modelformset_factory
ProjectFormSet = modelformset_factory(my_project.content_type.model_class())
my_form = ProjectFormSet()

但是这种形式当然不会得到我的模型形式中的所有定制......所以这不是一个好的解决方案。

于 2011-01-06T17:00:30.417 回答