2

In web2py custom widgets get field description and value as arguments, while represent functions get value and table row. Is it possible to pass row to a custom widget function? I need to access other columns of the same row. I use rows inside SQLForm.smartgrid, so I don't have much control in this situation.

user174916
  • 97
  • 8

2 Answers2

2

Assuming this is for dealing with SQLFORM.smartgrid update forms, you can try something like the following trick:

def show_grid():
    if 'edit' in request.args:
        db.mytable.myfield.record = db.mytable(request.args(-1))
    return dict(grid=SQLFORM.smartgrid(db.mytable))

The above code adds a "record" attribute to the field object (which will get passed to the widget, where you can then extract the record from the field object). Grid/smartgrid "edit" links include the record ID as the last URL arg, which is accessed via request.args(-1) above.

In your custom widget code:

def mywidget(field, value):
    record = field.record  # here you have the whole record
    ...
Anthony
  • 25,466
  • 3
  • 28
  • 57
0

The widget method itself only receives the field and value arguments, however, when you define the widget object you can add more arguments. Consider

In widget code

Class CustomWidget():
    def __init__(self, custom_arg_1, custom_arg_2): # Name them as needed
        self.custom_arg_1 = custom_arg_1
        self.custom_arg_2 = custom_arg_2

    def widget(field, value):
        if self.custom_arg_1 == self.custom_arg_2:
            return "Something helpful"
        else:
            return "Something else"

Then in your controller

from somewhere import CustomWidget

def this_uses_custom_widget():
    widget_with_args = CustomWidget(3,4) # Pass whatever you need there
    db.table.field.widget = widget_with_args.widget

Or, if those arguments are more global, you can declare the widget in the model.

Hilton Shumway
  • 582
  • 5
  • 8