DJANGO - Come generare una forma per un modello non è noto in anticipo, perché dell'istanza contentType

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

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)
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top