2 Stimmen

web2py: Widget in roher Form ändern

Ich habe ein CRUD-Formular, das ein Select-Widget hat. Die Optionen im Widget sind dynamisch. Ich kann keine Tags verwenden, da die Werte aus anderen Tabellen stammen. Ich versuche, die Werte in der Steuerung mit dieser Methode zu ändern:

def change_widget(form, id, widget):
"Tries to find a widget in the given form with the given id and swaps it with the given widget"
for i in range( len(form[0].components) ):
    if hasattr(form[0].components[i].components[1].components[0], 'attributes'):
        if '_id' in form[0].components[i].components[1].components[0].attributes:
            if form[0].components[i].components[1].components[0].attributes['_id'] == id:
                form[0].components[i].components[1].components[0] = widget
                return True

return False

Nachdem ich die Methode aufgerufen und das Formular überprüft habe, kann ich sehen, dass das Formular erfolgreich geändert wurde. Auf der Ansichtsseite verwende ich eine benutzerdefinierte Ansicht und versuche, das Formular wie folgt anzuzeigen:

{{=form.custom.begin}} {{=form.custom.widget.customized_field}}
{{=form.custom.submit}} {{=form.custom.end}}

Aber es zeigt mir immer noch das ursprüngliche, unveränderte Widget an. Was mache ich falsch? Gibt es eine bessere Möglichkeit, dies zu tun?

4voto

Anthony Punkte 25336

Zunächst gibt es eine viel einfachere Möglichkeit, das Widget zu ersetzen:

form.element(_id=id).parent[0] = widget

Da Sie jedoch das ursprüngliche Widget vollständig durch ein neues Widget-Objekt ersetzen und nicht einfach nur das ursprüngliche Widget ändern, ist dies nicht möglich, form.custom.widget.customized_field verweist weiterhin auf das ursprüngliche Widget. Sie müssen also explizit ersetzen form.custom.widget.customized_field auch. Versuchen Sie es:

def change_widget(form, name, widget):
    form.element(_name=name).parent[0] = form.custom.widget[name] = widget

wobei name ist der Name des Feldes.

Véase ici für weitere Informationen zur Suche im serverseitigen DOM.

Beachten Sie auch, dass Sie ein benutzerdefiniertes Widget für das Feld angeben können, bevor das Formular überhaupt erstellt wird, entweder innerhalb der Tabellendefinition oder nachträglich:

db.define_table('mytable', Field('myfield', widget=custom_widget))

o

db.mytable.myfield.widget = custom_widget

Wenn Sie dann ein Formular erstellen, wird das benutzerdefinierte Widget verwendet und nicht das Standard-Widget.

Véase ici für weitere Informationen über Widgets.

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