DJANGO - Come generare una forma per un modello non è noto in anticipo, perché dell'istanza contentType
-
26-09-2019 - |
Domanda
Ho il seguente modello e la sua forma:
class Project(models.Model)
class ProjectForm(forms.ModelForm)
class Meta:
Model = Project
Così è facile per creare un modulo istanziando:
form = ProjectForm()
Ma nel mio caso, ho diversi modelli a parte "Progetti", e non so in anticipo per i quali di questi modelli ho bisogno per creare la forma.
Quindi vorrei creare la forma dall'istanza ContentType del modello di progetto.
In altre parole, sto cercando qualcosa che assomiglia a:
myproject = Project()
form = createform(myproject.ContentType)
Soluzione
Presumibilmente si hanno una certa selezione limitata di modelli che possono essere utilizzati. Il modo più semplice è solo per creare classi form per ciascuno di essi, quindi scegliere quello che vi serve da un dizionario:
MODEL_FORMS = {
MyModel: MyModelForm,
MyOtherModel: MyOtherModelForm
}
my_form_class = MODEL_FORMS[my_project.content_type]
my_form = my_form_class()
Altri suggerimenti
Purtroppo, questo è stato il migliore che ho trovato - ma una combinazione di get_model e form_for_model dovrebbe fare il trucco. Avrai bisogno di utilizzare get_model
per caricare il tipo di modello che si desidera lavorare, e poi form_for_model
per ottenere un modulo per quel modello.
Modifica :. La soluzione di Daniel è un molto meglio uno, se si sa che cosa modelli hai a che fare con il
Grazie a tutti e due, questo aiuta molto!
andrò con la soluzione di Daniel come ho un numero limitato di modelli.
Penso che forse ho bisogno di aggiungere model_class () per "my_project.content_type.model_class ()" al fine di ottenere la classe del modello (da verificare)?
Per la cronaca, io era riuscito a far funzionare qualcosa con le fabbriche modello formset:
from django.forms.models import modelformset_factory
ProjectFormSet = modelformset_factory(my_project.content_type.model_class())
my_form = ProjectFormSet()
ma questa forma sarebbe, naturalmente, non ottenere tutte le personalizzazioni fatto nei miei modelli di formulari ... in modo che non era una buona soluzione.