我有一个包含select小部件的CRUD表单。小部件中的选项是动态的。我不能使用标签,因为值来自其他表。我正在尝试使用此方法更改控制器中的值:
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
调用方法并检查表单后,我可以看到表单已成功修改。在视图方面,我正在使用自定义视图并尝试显示如下形式:
{{=form.custom.begin}} {{=form.custom.widget.customized_field}}
{{=form.custom.submit}} {{=form.custom.end}}
但是,它仍然显示原始未修改的小部件。我究竟做错了什么?有更好的方法吗?
答案 0 :(得分:4)
首先,这是一种更简单的方法来替换小部件:
form.element(_id=id).parent[0] = widget
但是,因为您使用新的窗口小部件对象完全替换原始窗口小部件而不是简单地修改原始窗口小部件,form.custom.widget.customized_field
仍将引用原始窗口小部件。因此,您还必须明确替换form.custom.widget.customized_field
。尝试:
def change_widget(form, name, widget):
form.element(_name=name).parent[0] = form.custom.widget[name] = widget
其中name
是该字段的名称。
有关搜索服务器端DOM的更多信息,请参阅here。
另请注意,您可以在表格定义之前或之后创建表单之前为字段指定自定义窗口小部件:
db.define_table('mytable', Field('myfield', widget=custom_widget))
或
db.mytable.myfield.widget = custom_widget
然后,当您创建表单时,将使用自定义窗口小部件而不是默认窗口小部件。
有关小部件的更多信息,请参阅here。