2010-07-10 16 views
5

Ich versuche, zusätzliche Informationen an Felder eines Django-Formulars zu übergeben, um in einer Vorlage angezeigt zu werden. Ich habe versucht, den Konstruktor außer Kraft zu setzen und eine andere Eigenschaft auf das Feld wie folgt hinzu:Anfügen zusätzlicher Informationen an Formularfelder

self.fields['field_name'].foo = 'bar' 

aber in der Vorlage dieses:

{{ form.field_name.foo }} 

nichts drucken. Weiß jemand, wie man einem Feld zusätzliche Informationen hinzufügt, ohne die Formularfeldklassen neu zu schreiben/zu erben?

+0

Verwandte: http://stackoverflow.com/questions/2270550/warnings-or-even-info-messages-instead-of-only-errors-in-django – guettli

Antwort

6

Nach django.forms.forms, die __getitem__() Methode eines Form schafft etwas ein BoundField aus dem Feld aufgerufen, bevor es zurückkehrt, so dass es von Strippen, was auch immer Änderungen. Wenn Sie wirklich mehr Funktionalität in die einfügen möchten, überschreiben diese Methode Zeug zum gebundenen Feld zu tun, bevor es zurückkehrt:

class MyForm(forms.Form): 
    def __getitem__(self, name): 
     boundfield = super(forms.Form,self).__getitem__(name) 
     boundfield.foo = "bar" 
     return boundfield 

Dann "bar" wird für alle Felder in dieser Form erscheinen. Sie können auch eine Funktion erstellen und diese stattdessen aufrufen, um mehr als nur eine fest codierte Zeichenfolge zu erhalten.

Während es mehr Standard ist, weitere Felder hinzuzufügen oder dem Formular selbst Eigenschaften hinzuzufügen, wenn Sie eine ganz neue Klasse von Informationen haben, die jedes Feld enthalten muss, kann dies das für Sie tun.


Ein anderer Weg, um die gleiche Sache zu bekommen, ist ein Attribut des Feldes zu bearbeiten, es dann über die BoundField ‚s "field" Attribut zuzugreifen:

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs) 
     super(forms.Form, self).__init__(*args, **kwargs) 
     self.fields['field_name'].foo = "bar" 

, dann foo in einer Vorlage für den Zugriff auf:

{{ form.field_name.field.foo }} 
+1

Danke für t Die Erklärung. Ich habe den letzten der beiden Ansätze ausprobiert und es hat wie ein Zauber funktioniert - nochmals vielen Dank. – Max

Verwandte Themen