【问题标题】:web2py: modify widget in crud formweb2py:以 crud 形式修改小部件
【发布时间】:2012-03-09 21:22:00
【问题描述】:

我有一个带有选择小部件的 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}}

但是,它仍然向我显示原始未修改的小部件。我究竟做错了什么?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: web2py


    【解决方案1】:

    首先,这里有一个更简单的替换小部件的方法:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2022-08-04
      相关资源
      最近更新 更多