2012-03-25 23 views
1

Ich habe ein Modell, das einige Felder hat, die nie bearbeitet werden sollten, z. B. "Datum erstellt". Ich möchte ein Formular anzeigen, das einige Textfelder mit den zusätzlichen Informationen enthält, wahrscheinlich nur die Daten selbst in einem <span>. Eine Person kann einige Felder bearbeiten und gleichzeitig zusätzliche Informationen über die Instanz des Modells anzeigen, z. B. erstellte, zuletzt geänderte oder sogar verwandte Objekte in der Datenbank für dieses Objekt. Gibt es eine Möglichkeit, dies mithilfe von Djangos integriertem Framework zu tun, oder muss ich ein eigenes benutzerdefiniertes Formular erstellen, indem ich das gesamte Objekt an eine Vorlage übergebe?Django Formular mit zusätzlichen Informationen

Wenn dies mehr Klärung benötigt, zögern Sie nicht zu fragen.

+0

Wie erstellen Sie derzeit das Formular? Ich weiß nicht, ob es eine Abkürzung für ein Modell gibt, aber Claudes Antwort zeigt, wie ich ein Meta-Objekt in der Formularklasse bevölkere. – forivall

+0

Ich verwende ModelForm und Form. Ich werde heute Abend beide Vorschläge in Betracht ziehen und sehen, was ich daraus machen kann. – andermic

Antwort

0

der beste Weg, ich weiß, dies zu tun ist, um die Felder zu initialisieren, bevor Sie das Formular an die Vorlage, indem ein initial Wörterbuch in das Formular übergeben oder durch Übergeben eines instance Objekts an das Formular.

Sie sollten dann sicherstellen, dass die Felder deaktiviert sind, oder Sie sollten sie ausgeblendete Felder machen und dann die Felder als regulären Text anzeigen.

Am wichtigsten, wenn Sie Daten an den Client übergeben, die dann in einem Formular zurückgeschickt werden, sollten Sie sicherstellen, dass die eingehenden Daten die gleichen wie die Daten sind, die ausgegangen sind (aus Sicherheitsgründen). Tun Sie dies mit um clean_[field] Funktion auf dem Formular. Es sollte wie folgt aussehen.

class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
    def clean_date_created(self): 
     if self.cleaned_fields['date_created'] != self.instance.date_created: 
      raise ValidationError, 'date_created has been tampered' 
     self.cleaned_fields['date_created'] 

[Edit/Nachtrag] Alternativ können Sie die Daten direkt an die Vorlage übergeben separat zu machen, und dann auf die Daten in das Formular heften, nachdem Sie es wieder in den Blick zu bekommen. Es sollte so etwas gehen:

def recieve_form(request, ...): 
    ... 
    f = MyForm(request.POST, instance=a) 
    new_model_instance = f.save(commit=False) 
    new_model_instance.date_created = <whatever> 
    new_model_instance.save() 
0

tun, dass ich in der Regel die Form, um für das Widget anpassen, dass nur gelesen werden, wie die folgenden:

class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     widgets = { 
      'my_field': forms.TextInput(attrs={'disabled':'disabled'}), 
     } 

Dieser Wille Ausgang ein Nur-Lese-Textfeld, aber ich denke, Sie auch ein Widget erstellen das wird nur ausgegeben ein <div> oder ein <p> (oder was auch immer Sie brauchen)

Verwandte Themen