DJANGO - Как создать форму для модели, неизвестной заранее из-за экземпляра contentType - PullRequest
1 голос
/ 06 января 2011

У меня есть следующая модель и ее форма:

class Project(models.Model)

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

Так что создать форму легко, создав ее экземпляр:

form = ProjectForm()

Но в моем случае у меня есть несколько моделей в сторонеиз «Проектов», и я заранее не знаю, для какой из этих моделей мне нужно будет создать форму.

Поэтому я хотел бы создать форму из экземпляра ContentType модели Project.

Другими словами, я ищу что-то похожее на:

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

Ответы [ 3 ]

3 голосов
/ 06 января 2011

Предположительно, у вас есть определенный ограниченный выбор моделей, которые могут быть использованы. Самый простой способ - просто создать классы форм для каждого из них, а затем выбрать тот, который вам нужен, из словаря:

MODEL_FORMS = {
    MyModel: MyModelForm,
    MyOtherModel: MyOtherModelForm
}

my_form_class = MODEL_FORMS[my_project.content_type]
my_form = my_form_class()
1 голос
/ 06 января 2011

Спасибо вам обоим, это очень помогает!

Я пойду с решением Дэниела, так как у меня ограниченное количество моделей.

Я думаю, возможно, мне нужно будет добавить 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()

но в этой форме, конечно, не будут все настройки, сделанные в моих модельных формах ... так что это не было хорошим решением.

1 голос
/ 06 января 2011

К сожалению, это было лучшее, что я смог найти - но комбинация get_model и form_for_model должна сработать.Вам нужно будет использовать get_model для загрузки типа модели, с которой вы хотите работать, а затем form_for_model, чтобы получить форму для этой модели.

Редактировать : решение Дэниелагораздо лучше, если вы знаете, с какими моделями вы имеете дело.

...