DJANGO - Wie ein Formular für ein Modell nicht im Voraus bekannt zu erzeugen, wegen der content Instanz

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

Frage

Ich habe folgendes Modell und seine Form:

class Project(models.Model)

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

So ist es einfach, eine Form von Instanziierung zu erstellen:

form = ProjectForm()

Aber in meinem Fall habe ich mehrere Modelle abgesehen von „Projekten“, und ich weiß nicht im Voraus, für die diese Modelle, die ich benötigen, um das Formular zu erstellen.

So würde Ich mag die Form aus dem Content Instanz des Projektmodells erstellen.

Mit anderen Worten, ich bin auf der Suche nach etwas, das aussieht wie:

myproject = Project()
form = createform(myproject.ContentType)
War es hilfreich?

Lösung

Vermutlich haben Sie eine gewisse begrenzte Auswahl an Modellen, die verwendet werden könnten. Der einfachste Weg ist nur Formularklassen für jeden von ihnen zu erstellen, wählen Sie dann die, die Sie aus einem Wörterbuch benötigen:

MODEL_FORMS = {
    MyModel: MyModelForm,
    MyOtherModel: MyOtherModelForm
}

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

Andere Tipps

Leider war dies das Beste, was ich finden konnte - sondern eine Kombination von get_model und form_for_model sollte es tun. Sie werden zum Einsatz get_model benötigen den Modelltyp Sie arbeiten möchten, zu laden, und dann für dieses Modell ein Formular erhalten form_for_model zu.

Bearbeiten :. Daniels Lösung ist eine viel bessere, wenn Sie wissen, welche Modelle Sie sind den Umgang mit

Danke an euch beide, das hilft viel!

Ich werde mit Daniels Lösung gehen, wie ich eine begrenzte Anzahl von Modellen haben.

Ich denke, vielleicht muss ich model_class () auf „my_project.content_type.model_class ()“ zu geben, um die Modellklasse zu bekommen (zu prüfen)?

Nur für das Protokoll, ich hatte es geschafft, etwas Arbeit mit dem Modell formset Fabriken zu machen:

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

aber diese Form würde natürlich alle die Anpassung gemacht in meinem Modell Formen nicht bekommen ... so dass keine gute Lösung war.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top