2 Stimmen

Speicherung der dynamischen Form in einem Modell

Ich möchte ein System mit Django aufbauen, das es den Benutzern ermöglicht, Formulare zu erstellen, sie zu speichern und von ihren Kunden verwenden zu lassen. Ich weiß, wie ich die Formulare dynamisch erstellen kann, aber ich bin auf der Suche nach einer guten Möglichkeit, die Formularklassen zu verwenden und viele verschiedene dynamische Formulare der Benutzer auf elegante Weise zu behandeln.

Ich denke an die Speicherung der Formularfeldinformationen als Wörterbuch in der Datenbank. Gibt es eine Möglichkeit in Django, dieses Wörterbuch wieder in ein Formularobjekt zu interpretieren? Oder muss ich eine Routine schreiben, die einfach interpretiert und ein Formular in HTML selbst erstellen wird?

Wenn jemand weiß, wo ich die Informationen finden kann, wäre ich sehr dankbar.

3voto

Alex Martelli Punkte 805329

Dies ist eine Python-Frage mehr als eine Django-Frage, daher mein Tag bearbeiten.

Um das Äquivalent von, sagen wir, zu reproduzieren:

class MyForm(forms.Form):
    foo = forms.CharField(max_length=100)

brauchen Sie etwas wie:

f = type(forms.Form)('MyForm', forms.Form, d)

wobei d ist ein Wörterbuch wie:

d = { 'foo': forms.CharField(max_length=100) }

Natürlich wird die Formularklasse am Ende an den Namen f (Sie können die setattr um es zu binden an qualifiziert Name something.MyForm für einen geeigneten something aber bitte denken Sie nicht im Traum daran, sie an eine nackt Namen, der dynamisch variabel ist - es wäre auch ein Alptraum, wenn verwenden. so ein blöder Name!).

Um also das Objekt der Formularklasse zur Laufzeit neu zu erstellen, müssen Sie es erhalten:

  1. sein Name MyForm
  2. ein Diktat mit den Feldnamen als Schlüsseln und den Feldobjekten als Werten

und damit Punkt 2 funktioniert, müssen Sie ebenfalls für jedes Feld (außer dem Namen) die Typ Name (damit Sie den Typ mit einer getattr von forms ) und seinen benannten Parametern (als Diktat), so dass Sie im Grunde Folgendes tun können

d[fieldname] = getattr(forms, fieldtypename)(**fieldparameters)

basierend auf Zeichenketten fieldname y fieldtypename und Diktat fieldparameters für jedes Feld, wenn Sie das Wörterbuch neu erstellen d (d. h., bereiten Sie sich darauf vor, Schritt 2 der oben genannten kurzen Liste zu erfüllen;-).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X