DJANGO-如何为由于contentType实例而事先未知的模型生成表单

DJANGO-如何为由于contentType实例而事先未知的模型生成表单,django,forms,django-forms,contenttype,Django,Forms,Django Forms,Contenttype,我有以下模型及其形式: class Project(models.Model) class ProjectForm(forms.ModelForm) class Meta: Model = Project 因此,通过实例化以下内容可以轻松创建表单: form = ProjectForm() 但在我的例子中,除了“项目”之外,我还有几个模型,我事先不知道我需要为这些模型中的哪一个创建表单 因此,我想从项目模型的ContentType实例创建表单 换句话说,我要找的东西

我有以下模型及其形式:

class Project(models.Model)

class ProjectForm(forms.ModelForm)
    class Meta:
        Model = Project
因此,通过实例化以下内容可以轻松创建表单:

form = ProjectForm()
但在我的例子中,除了“项目”之外,我还有几个模型,我事先不知道我需要为这些模型中的哪一个创建表单

因此,我想从项目模型的ContentType实例创建表单

换句话说,我要找的东西看起来像:

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

不幸的是,这是我所能找到的最好的方法——但是和的结合应该可以达到目的。您需要使用
get\u model
加载要处理的模型类型,然后使用
form\u for\u model
获取该模型的表单


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

不幸的是,这是我能找到的最好的解决方案,但是和的组合应该可以解决这个问题。您需要使用
get\u model
加载要处理的模型类型,然后使用
form\u for\u model
获取该模型的表单


编辑:如果你知道你在处理什么模型,Daniel的解决方案会好得多。

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

MODEL_FORMS = {
    MyModel: MyModelForm,
    MyOtherModel: MyOtherModelForm
}

my_form_class = MODEL_FORMS[my_project.content_type]
my_form = my_form_class()

大概您可以使用有限的模型选择。最简单的方法就是为每个表单创建表单类,然后从字典中选择所需的表单类:

MODEL_FORMS = {
    MyModel: MyModelForm,
    MyOtherModel: MyOtherModelForm
}

my_form_class = MODEL_FORMS[my_project.content_type]
my_form = my_form_class()

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

我将使用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()

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

谢谢你们两位,这非常有帮助

我将使用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()

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

奇怪的是,Django没有提供从模型获取模型表单的方法?难道我们没有通过:class Meta:model=projecto获得信息吗?Django没有提供从模型获取模型表单的方法,这很奇怪?我们不是通过:class Meta:model=Project获得了信息吗