DJANGO - How to generate a form for a model not known in advance because of the contentType instance

StackOverflow https://stackoverflow.com/questions/4616735

문제

I have the following model and it's form:

class Project(models.Model)

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

So it's easy to create a form by instantiating:

form = ProjectForm()

But in my case, I have several models aside from "Projects", and I don't know in advance for which of these models I will need to create the form.

So I would like to create the form from the ContentType instance of the Project model.

In other words, I'm looking for something that looks like:

myproject = Project()
form = createform(myproject.ContentType)
도움이 되었습니까?

해결책

Presumably you have a certain limited selection of models that might be used. The simplest way is just to create form classes for each of them, then choose the one you need from a dictionary:

MODEL_FORMS = {
    MyModel: MyModelForm,
    MyOtherModel: MyOtherModelForm
}

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

다른 팁

Unfortunately, this was the best I could find - but a combination of get_model and form_for_model should do the trick. You'll need to use get_model to load up the model type you want to work on, and then form_for_model to get a form for that model.

Edit: Daniel's solution is a much better one if you know what models you're dealing with.

Thank you to both of you, this helps a lot !

I will go with Daniel's solution as I have a limited number of models.

I think maybe I will need to add model_class() to "my_project.content_type.model_class()" in order to get the model class (to be checked) ?

Just for the record, I had managed to make something work with model formset factories :

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

but this form would of course not get all the customisations made in my model forms... so that was not a good solution.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top