2012-02-19 5 views
2

私は選択ウィジェットを持つCRUDフォームを持っています。ウィジェットのオプションは動的です。値は他のテーブルから来ているので、タグは使用できません。私はこの方法を使用してコントローラの値を変更しようとしています:私は、メソッドを呼び出すと、フォームを点検web2py: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}} 

しかし、それはまだ私のオリジナル無修正ウィジェットを示しています。私は間違って何をしていますか?これを行うより良い方法はありますか?

答えて

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を参照してください。

関連する問題