Did you make dummy app for testing it? Please attach it here and I have a look to your code... I can't help much if I don't have a good idea of what you have done...
new_exp_num=form.vars.exp_num This is something I left which should be adapted to your app... form.vars.exp_num is the representation of the new inputed record... The same field name you specify in the widget declaration for the field attribute : db.table.representing_field, but that you get from the form of the referenced table. Richard On Mon, May 11, 2015 at 3:28 PM, LoveWeb2py <atayloru...@gmail.com> wrote: > Thanks haha. Just checking. Still not having much luck. I'm getting a 500 > error on the add function and can't figure out why > > when I try to edit my site I am getting an error for the "add function" > specified to add the > https://www.mywebsite.com/add_function/second_table_field > def add_function(): > """ > Modal form for adding element > """ > > > buttons = [TAG.button((I('', _class='icon-ok icon-large icon-white'), > CAT(' '), STRONG(T('Add'))), > _type='submit', > _class='btn btn-small btn-primary', > _id='add_button_id', > _name='add_button', > )] > form = SQLFORM(db.table, buttons=buttons, formstyle=formstyle, > separator=separator) > response.js = '$(document).ready(function(){ > $(".input_wrapper").has(".error").addClass("inputError"); ' \ > '$(".w2p_fw").has(".error").addClass("control-group > error"); ' \ > '$(".w2p_fw").each(function(){ > $(this).find(".error_wrapper").appendTo(this); }); });' > response.js += '$(document).ready(function(){ > $("textarea").elastic(); });' > response.js += '$(document).ready(function () { > $("[rel=tooltip]").tooltip(); });' > if form.process(formname='add_form').accepted: > response.flash = T("Added") > target = request.args(0) > # close modal > response.js = '$("#{target}_modal-form").modal("hide");'.format( > target=target) > # update the select options > response.js += """$("#{target}").append( > "<option value='{new_id}'> > {new_id} > </option>");""".format(target=target, new_id= > form.vars.id) > # select newly added option > response.js += """$("#{target}").val("{new_exp_num}"); > > $('#{target}').keyup(); $('#{target}').blur(); > """.format(target=target, > > new_exp_num=form.vars.exp_num) > elif form.errors: > response.flash = '' > else: > response.flash = '' > return dict(form=form) > > Do I need to actually specify the db.table? From the looks of the class I > thought it would be defined on its own... am I wrong? > > Sorry for asking so many questions. I think this will be really helpful > when it's all finished. > > > > > On Monday, May 11, 2015 at 2:59:21 PM UTC-4, Richard wrote: >> >> The commented lines in the class was there because I recently refactor it >> to make it use boostrap modal instead of jquery ui dialog as you may >> understand carefully reading the code!! >> >> :-P >> >> Richard >> >> On Mon, May 11, 2015 at 2:40 PM, LoveWeb2py <atayl...@gmail.com> wrote: >> >>> Are the commented lines necessary or was that for self reference? >>> >>> # js += '$("#%s_option_add_trigger"). >>> click(function() {' \ >>> # ' $("#%s_dialog-form").dialog("open");' \ >>> # ' return false;' \ >>> # ' }); ' % (my_select_id, my_select_id) >>> >>> >>> >>> On Thursday, May 7, 2015 at 9:33:28 AM UTC-4, Richard wrote: >>>> >>>> you need bootstrap 2.3.2 (not tested with BS3, but I am pretty sure it >>>> is not working, too differents)... >>>> >>>> Did you try it with a recent web2py setup? I would suggest you try with >>>> web2py 2.9.5 which is what I use actually and it works... >>>> >>>> Richard >>>> >>>> On Thu, May 7, 2015 at 9:20 AM, LoveWeb2py <atayl...@gmail.com> wrote: >>>> >>>>> Another observation: >>>>> >>>>> All of this code: >>>>> >>>>> >>>>> >>>>>> js += '$(function() {' \ >>>>>> ' $("#%s_option_add_trigger").button({' \ >>>>>> ' text: true,' \ >>>>>> ' icons: {' \ >>>>>> ' primary: "ui-icon-circle-plus"' \ >>>>>> ' }' \ >>>>>> ' });' \ >>>>>> '});' % (my_select_id) >>>>>> js += '$(function() { ' \ >>>>>> ' $( "#%s_option_add_trigger" ).css("margin-left", >>>>>> "+=5"); ' \ >>>>>> '});' % (my_select_id) >>>>>> js += >>>>>> '$("#{modal_id}").appendTo("body");'.format(modal_id=my_select_id >>>>>> + "_modal-form") >>>>>> >>>>>>> >>>>>>> Get's commented out when it's rendered so it ends up looking like >>>>> this <!-- $(document).read(function() .... .appendTo("body");}); //--> >>>>> >>>>> Any idea why that could be happening and would that impact the button >>>>> showing the modal >>>>> >>>>> On Thursday, May 7, 2015 at 8:45:49 AM UTC-4, LoveWeb2py wrote: >>>>> >>>>>> Hi Richard! >>>>>> >>>>>> I think I'm getting close. No more errors, and I applied the widget >>>>>> to the field successfully. I see the + sign next to my field, but nothing >>>>>> happens when I click it so I'm going over the javascript with a fine >>>>>> tooth >>>>>> comb. Is there any additional .js or .css files I need to include? >>>>>> >>>>>> This is really looking promising! >>>>>> >>>>>> On Wednesday, May 6, 2015 at 12:42:34 PM UTC-4, Richard wrote: >>>>>> >>>>>> Let say the FK field is field2 : >>>>>> >>>>>> Field('field2','reference main_table', # Better syntax thand >>>>>> "db.main_table" >>>>>> widget=AutocompleteWidgetSelectOrAddOption( >>>>>> request=request, >>>>>> >>>>>> field=db.main_table.field1, # which is you reprensting field >>>>>> id_field= >>>>>> db.main_table.id, >>>>>> limitby=(0, 10), # >>>>>> how much records you want in the dropbox >>>>>> min_length=6, # when >>>>>> you want the autocomplete pop in or how many caracters user have to >>>>>> entered >>>>>> before the autocomplete kickin >>>>>> form_title=T('Add new >>>>>> title'), >>>>>> controller="controler >>>>>> name that contains the below function", >>>>>> function="your add >>>>>> function name", >>>>>> button_text=T('Add >>>>>> new'), >>>>>> placeholder=T('Start >>>>>> typing...')) >>>>>> >>>>>> Richard >>>>>> >>>>>> On Wed, May 6, 2015 at 12:34 PM, LoveWeb2py <atayl...@gmail.com> >>>>>> wrote: >>>>>> >>>>>> Thank you, Richard. I think i'm getting closer. Could you show me an >>>>>> example of how you apply this to a specific field in SQLFORM? >>>>>> >>>>>> Going back to my original model: >>>>>> >>>>>> db.define_table('main_table', >>>>>> Field('field1','string'), >>>>>> Field('field2','string'), >>>>>> migrate=False) >>>>>> >>>>>> db.define_table('second_table', >>>>>> Field('field1','db.main_table'), >>>>>> Field('field2','db.main_table') >>>>>> migrate=False) >>>>>> >>>>>> How could I integrate your widget with field 2 for a SQLFORM? >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Wednesday, May 6, 2015 at 9:40:02 AM UTC-4, Richard wrote: >>>>>> >>>>>> The id field and what field you want to show as a representation of >>>>>> the id field of the referenced table... >>>>>> >>>>>> Start by putting the widget class in model file even if it not a good >>>>>> thing to see if you can make it works... >>>>>> >>>>>> In the module I have these imports : >>>>>> >>>>>> from gluon.html import * >>>>>> from gluon.sqlhtml import * >>>>>> from gluon import current >>>>>> from gluon.compileapp import LOAD >>>>>> >>>>>> >>>>>> Which may not be related to the widget class... >>>>>> >>>>>> Richard >>>>>> >>>>>> >>>>>> On Tue, May 5, 2015 at 4:28 PM, LoveWeb2py <atayl...@gmail.com> >>>>>> wrote: >>>>>> >>>>>> Hi Richard, >>>>>> >>>>>> I'm trying to get this setup, but am receiving an error self.url = >>>>>> URL(args=request.args)\nNameError: global name \'URL\' is not defined\n'. >>>>>> I'm wondering if this is because the gluon hasn't been imported yet. >>>>>> >>>>>> Also, could you ellaborate more on this? >>>>>> >>>>>> >>>>>> field=db.table.representing_field, >>>>>> >>>>>> id_field=db.table.id_field, >>>>>> >>>>>> id_field should be the foreignkey table if I am not mistaking? >>>>>> db.table.representing field, and db.table2.id_field (with foreign key) >>>>>> does >>>>>> that sound right? >>>>>> >>>>>> >>>>>> On Wednesday, April 29, 2015 at 10:04:35 AM UTC-4, Richard wrote: >>>>>> >>>>>> *# In a modules :* >>>>>> >>>>>> class AutocompleteWidgetSelectOrAddOption(object): >>>>>> _class = 'string' >>>>>> >>>>>> def __init__(self, >>>>>> request, >>>>>> field, >>>>>> id_field=None, >>>>>> db=None, >>>>>> orderby=None, >>>>>> limitby=(0, 10), >>>>>> keyword='_autocomplete_%(fieldname)s', >>>>>> min_length=2, >>>>>> # >>>>>> ------------------------------------------------------------- >>>>>> # From : SelectOrAddOption >>>>>> controller=None, function=None, form_title=None, >>>>>> button_text = None, dialog_width=1000, >>>>>> # >>>>>> ------------------------------------------------------------- >>>>>> placeholder=None >>>>>> ): >>>>>> self.request = request >>>>>> self.keyword = keyword % dict(fieldname=field.name) >>>>>> self.db = db or field._db >>>>>> self.orderby = orderby >>>>>> self.limitby = limitby >>>>>> self.min_length = min_length >>>>>> self.fields = [field] >>>>>> self.placeholder = placeholder >>>>>> if id_field: >>>>>> self.is_reference = True >>>>>> self.fields.append(id_field) >>>>>> else: >>>>>> self.is_reference = False >>>>>> if hasattr(request, 'application'): >>>>>> self.url = URL(args=request.args) >>>>>> self.callback() >>>>>> else: >>>>>> self.url = request >>>>>> # >>>>>> ---------------------------------------------------------------------- >>>>>> # From : SelectOrAddOption >>>>>> if form_title is None: >>>>>> self.form_title = current.T('Add New') >>>>>> else: >>>>>> self.form_title = current.T(form_title) >>>>>> if button_text is None: >>>>>> self.button_text = current.T('Add') >>>>>> else: >>>>>> self.button_text = current.T(button_text) >>>>>> self.dialog_width = dialog_width >>>>>> >>>>>> self.controller = controller >>>>>> self.function = function >>>>>> # >>>>>> ---------------------------------------------------------------------- >>>>>> >>>>>> def callback(self): >>>>>> if self.keyword in self.request.vars: >>>>>> field = self.fields[0] >>>>>> rows = >>>>>> self.db(field.like(self.request.vars[self.keyword]+'%') >>>>>> ).select(orderby=self.orderby, >>>>>> limitby=self.limitby, *self.fields) >>>>>> if rows: >>>>>> if self.is_reference: >>>>>> id_field = self.fields[1] >>>>>> raise HTTP(200, SELECT(_id=self.keyword, >>>>>> _class='autocomplete', >>>>>> _size=len(rows), >>>>>> _multiple=(len(rows) == 1), >>>>>> *[OPTION(s[field.name], >>>>>> _value=s[id_field.name], >>>>>> _selected=(k == >>>>>> 0)) >>>>>> for k, s in >>>>>> enumerate(rows)]).xml()) >>>>>> else: >>>>>> raise HTTP(200, SELECT(_id=self.keyword, >>>>>> _class='autocomplete', >>>>>> _size=len(rows), >>>>>> _multiple=(len(rows) == 1), >>>>>> *[OPTION(s[field.name], >>>>>> _selected=(k == >>>>>> 0)) >>>>>> for k, s in >>>>>> enumerate(rows)]).xml()) >>>>>> else: >>>>>> >>>>>> raise HTTP(200, '') >>>>>> >>>>>> def __call__(self, field, value, **attributes): >>>>>> # >>>>>> ---------------------------------------------------------------------- >>>>>> # From : SelectOrAddOption >>>>>> my_select_id = '%s_%s' % (field._tablename, field.name) >>>>>> # 'test_ph_eregistry_id' #select_widget.attributes.get('_id', >>>>>> None) >>>>>> >>>>>> add_args = [my_select_id] >>>>>> # create a div that will load the specified controller via >>>>>> ajax >>>>>> # form_loader_div = DIV(LOAD(c=self.controller, >>>>>> f=self.function, args=add_args, ajax=True), >>>>>> # _id=my_select_id + "_dialog-form", >>>>>> _title=self.form_title) >>>>>> form_loader_div = DIV(DIV(BUTTON('x', _type='button', >>>>>> _class='close', >>>>>> **{'_data-dismiss': 'modal', >>>>>> '_aria-hidden': 'true'}), >>>>>> H3(self.form_title, >>>>>> _id='myModalLabel'), _class='modal-header'), >>>>>> DIV(LOAD(c=self.controller, >>>>>> f=self.function, args=add_args, ajax=True, ajax_trap=True), >>>>>> _class='modal-body'), >>>>>> _id=my_select_id + "_modal-form", >>>>>> _class='modal hide fade', >>>>>> **{'_tabindex': '-1', '_role': >>>>>> 'dialog', '_aria-labelledby': 'myModalLabel', >>>>>> '_aria-hidden': 'true'}) >>>>>> # generate the "add" button that will appear next the options >>>>>> widget and open our modal >>>>>> activator_button = A(I(_class='icon-plus-sign icon-2x'), >>>>>> _id=my_select_id+"_option_add_trigger", >>>>>> _class='add-and-select-button') >>>>>> # create javascript for creating and opening the dialog >>>>>> # js = '$("#%s_dialog-form").dialog({' \ >>>>>> # ' autoOpen: false,' \ >>>>>> # ' show: "fade",' \ >>>>>> # ' hide: "fade",' \ >>>>>> # ' width: %s' \ >>>>>> # ' });' % (my_select_id, self.dialog_width) >>>>>> js = '$("#%s_modal-form").modal({ backdrop: true, keyboard: >>>>>> true, show: false });' % (my_select_id) >>>>>> # js += '$("#%s_option_add_trigger").click(function() {' \ >>>>>> # ' $("#%s_dialog-form").dialog("open");' \ >>>>>> # ' return false;' \ >>>>>> # ' }); ' % (my_select_id, my_select_id) >>>>>> js += '$("#%s_option_add_trigger").click(function() ' \ >>>>>> '{ $("#%s_modal-form").modal("show"); return false; }); >>>>>> ' % (my_select_id, my_select_id) >>>>>> # decorate our activator button for good measure >>>>>> js += '$(function() {' \ >>>>>> ' $("#%s_option_add_trigger").button({' \ >>>>>> ' text: true,' \ >>>>>> ' icons: {' \ >>>>>> ' primary: "ui-icon-circle-plus"' \ >>>>>> ' }' \ >>>>>> ' });' \ >>>>>> '});' % (my_select_id) >>>>>> js += '$(function() { ' \ >>>>>> ' $( "#%s_option_add_trigger" ).css("margin-left", >>>>>> "+=5"); ' \ >>>>>> '});' % (my_select_id) >>>>>> js += >>>>>> '$("#{modal_id}").appendTo("body");'.format(modal_id=my_select_id + >>>>>> "_modal-form") >>>>>> # jQuery .appendTo() move modal div in body to avoid nested >>>>>> form which are not allow in HTML >>>>>> js = """$(document).ready(function() { >>>>>> %s >>>>>> });""" % js >>>>>> jq_script = SCRIPT(js, _type="text/javascript") >>>>>> >>>>>> wrapper = DIV(_id=my_select_id+"_adder_wrapper") >>>>>> # >>>>>> ---------------------------------------------------------------------- >>>>>> default = dict( >>>>>> _type='text', >>>>>> value=(not value is None and str(value)) or '', >>>>>> ) >>>>>> attr = StringWidget._attributes(field, default, >>>>>> _placeholder=self.placeholder, **attributes) >>>>>> div_id = self.keyword+'_div' >>>>>> attr['_autocomplete'] = 'off' >>>>>> if self.is_reference: >>>>>> key2 = self.keyword+'_aux' >>>>>> key3 = self.keyword+'_auto' >>>>>> # >>>>>> ----------------------------------------------------------------------------- >>>>>> # find the longest record and set input size attribute >>>>>> accordingly >>>>>> length = self.fields[0].len() >>>>>> longest_record_length = >>>>>> len(self.db().select(self.fields[0], >>>>>> >>>>>> orderby=~length, >>>>>> limitby=(0, >>>>>> 1)).first()[self.fields[0].name]) >>>>>> attr['_size'] = int(longest_record_length * 1.20) # 20% >>>>>> wider field width >>>>>> # >>>>>> ----------------------------------------------------------------------------- >>>>>> attr['_class'] = 'string' >>>>>> name = attr['_name'] >>>>>> if 'requires' in attr: >>>>>> del attr['requires'] >>>>>> attr['_name'] = key2 >>>>>> value = attr['value'] >>>>>> record = self.db(self.fields[1] == >>>>>> value).select(self.fields[0]).first() >>>>>> attr['value'] = record and record[self.fields[0].name] >>>>>> attr['_onblur'] = >>>>>> "$('#%(div_id)s').delay(1000).fadeOut();" % \ >>>>>> dict(div_id=div_id, u='F'+self.keyword) >>>>>> # delay(500) is pretty important for "$('#%s').keyup(); >>>>>> $('#%s').blur();" >>>>>> # from the add_eregistry function >>>>>> attr['_onkeyup'] = \ >>>>>> "$('#%(key3)s').val('');" \ >>>>>> "var e = event.which?event.which:event.keyCode;" \ >>>>>> "function %(u)s() {" \ >>>>>> " $('#%(id)s').val($('#%(key)s >>>>>> :selected').text());" \ >>>>>> " $('#%(key3)s').val($('#%(key)s').val())" \ >>>>>> "};" \ >>>>>> "if (e == 39) %(u)s();" \ >>>>>> "else if (e == 40) {" \ >>>>>> " if ($('#%(key)s >>>>>> option:selected').next().length)" \ >>>>>> " $('#%(key)s >>>>>> option:selected').attr('selected', null).next().attr('selected', >>>>>> 'selected'); %(u)s();" \ >>>>>> "} else if (e == 38) {" \ >>>>>> " if ($('#%(key)s >>>>>> option:selected').prev().length)" \ >>>>>> " $('#%(key)s >>>>>> option:selected').attr('selected', null).prev().attr('selected', >>>>>> 'selected'); %(u)s();" \ >>>>>> "} else if ($('#%(id)s').val().length >= >>>>>> %(min_length)s)" \ >>>>>> " $.get('%(url)s?%(key)s=' + >>>>>> encodeURI($('#%(id)s').val()), function(data) {" \ >>>>>> " if (data == '')" \ >>>>>> " $('#%(key3)s').val('');" \ >>>>>> " else {" \ >>>>>> " $('#%(id)s').next('.error').hide();" \ >>>>>> " >>>>>> $('#%(div_id)s').html(data).show().focus();" \ >>>>>> " $('#%(div_id)s select').css('width', >>>>>> $('#%(id)s').css('width'));" \ >>>>>> " >>>>>> $('#%(key3)s').val($('#%(key)s').val());" \ >>>>>> " $('#%(key)s').change( %(u)s);" \ >>>>>> " $('#%(key)s').click( %(u)s);" \ >>>>>> " };" \ >>>>>> " });" \ >>>>>> "else $('#%(div_id)s').fadeOut();" % >>>>>> dict(url=self.url, min_length=self.min_length, >>>>>> >>>>>> key=self.keyword, id=attr['_id'], key2=key2, key3=key3, >>>>>> name=name, >>>>>> div_id=div_id, u='F'+self.keyword) >>>>>> if self.min_length == 0: >>>>>> attr['_onfocus'] = attr['_onkeyup'] >>>>>> wrapper.components.extend([TAG[''](INPUT(**attr), >>>>>> INPUT(_type='hidden', >>>>>> _id=key3, >>>>>> _value=value, >>>>>> _name=name, >>>>>> requires=field.requires), >>>>>> DIV(_id=div_id, >>>>>> _style='position:absolute;')), >>>>>> form_loader_div, >>>>>> activator_button, >>>>>> jq_script]) >>>>>> return wrapper >>>>>> else: >>>>>> attr['_name'] = field.name >>>>>> attr['_onblur'] = >>>>>> "$('#%(div_id)s').delay(1000).fadeOut();" % \ >>>>>> dict(div_id=div_id, u='F'+self.keyword) >>>>>> # delay(500) is pretty important for "$('#%s').keyup(); >>>>>> $('#%s').blur();" >>>>>> # from the add_eregistry function >>>>>> attr['_onkeyup'] = \ >>>>>> "var e = event.which?event.which:event.keyCode;" \ >>>>>> "function %(u)s() {" \ >>>>>> " $('#%(id)s').val($('#%(key)s').val())" \ >>>>>> "};" \ >>>>>> "if (e == 39) %(u)s();" \ >>>>>> "else if (e == 40) {" \ >>>>>> " if ($('#%(key)s >>>>>> option:selected').next().length)" \ >>>>>> " $('#%(key)s >>>>>> option:selected').attr('selected', null).next().attr('selected', >>>>>> 'selected'); %(u)s();" \ >>>>>> "} else if (e == 38) {" \ >>>>>> " if ($('#%(key)s option:selected').prev().length) >>>>>> $('#%(key)s option:selected').attr('selected', >>>>>> null).prev().attr('selected', 'selected'); %(u)s();" \ >>>>>> "} else if ($('#%(id)s').val().length >= >>>>>> %(min_length)s) $.get('%(url)s?%(key)s=' + encodeURI($('#%(id)s').val()), >>>>>> function(data) {" \ >>>>>> " $('#%(id)s').next('.error').hide();" \ >>>>>> " $('#%(div_id)s').html(data).show().focus();" \ >>>>>> " $('#%(div_id)s select').css('width', >>>>>> $('#%(id)s').css('width'));" \ >>>>>> " $('#%(key)s').change( %(u)s);" \ >>>>>> " $('#%(key)s').click( %(u)s);" \ >>>>>> "});" \ >>>>>> "else $('#%(div_id)s').fadeOut();" % >>>>>> dict(url=self.url, min_length=self.min_length, >>>>>> >>>>>> key=self.keyword, id=attr['_id'], div_id=div_id, >>>>>> >>>>>> u='F'+self.keyword) >>>>>> if self.min_length == 0: >>>>>> attr['_onfocus'] = attr['_onkeyup'] >>>>>> wrapper.components.extend([TAG[''](INPUT(**attr), >>>>>> DIV(_id=div_id, >>>>>> >>>>>> _style='position:absolute;')), >>>>>> form_loader_div, >>>>>> activator_button, >>>>>> jq_script]) >>>>>> return wrapper >>>>>> >>>>>> # In a model (a model file which is already call before you set your >>>>>> widget...) >>>>>> from a_widget import AutocompleteWidgetSelectOrAddOption >>>>>> >>>>>> *# In your controller * >>>>>> >>>>>> def add_function(): >>>>>> """ >>>>>> Modal form for adding element >>>>>> """ >>>>>> >>>>>> buttons = [TAG.button((I('', _class='icon-ok icon-large >>>>>> icon-white'), CAT(' '), STRONG(T('Add'))), >>>>>> _type='submit', >>>>>> _class='btn btn-small btn-primary', >>>>>> _id='add_button_id', >>>>>> _name='add_button', >>>>>> )] >>>>>> form = SQLFORM(db.table, buttons=buttons, formstyle=formstyle, >>>>>> separator=separator) >>>>>> response.js = '$(document).ready(function(){ >>>>>> $(".input_wrapper").has(".error").addClass("inputError"); ' \ >>>>>> '$(".w2p_fw").has(".error").addClass("control-group >>>>>> error"); ' \ >>>>>> '$(".w2p_fw").each(function(){ >>>>>> $(this).find(".error_wrapper").appendTo(this); }); });' >>>>>> response.js += '$(document).ready(function(){ >>>>>> $("textarea").elastic(); });' >>>>>> response.js += '$(document).ready(function () { >>>>>> $("[rel=tooltip]").tooltip(); });' >>>>>> if form.process(formname='add_form').accepted: >>>>>> response.flash = T("Added") >>>>>> target = request.args(0) >>>>>> # close modal >>>>>> response.js = >>>>>> '$("#{target}_modal-form").modal("hide");'.format(target=target) >>>>>> # update the select options >>>>>> response.js += """$("#{target}").append( >>>>>> "<option value='{new_id}'> >>>>>> {new_id} >>>>>> </option>");""".format(target=target, >>>>>> new_id=form.vars.id) >>>>>> # select newly added option >>>>>> response.js += """$("#{target}").val("{new_exp_num}"); >>>>>> $('#{target}').keyup(); >>>>>> $('#{target}').blur(); >>>>>> >>>>>> ... >>>>> >>>>> -- >>>>> Resources: >>>>> - http://web2py.com >>>>> - http://web2py.com/book (Documentation) >>>>> - http://github.com/web2py/web2py (Source code) >>>>> - https://code.google.com/p/web2py/issues/list (Report Issues) >>>>> --- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "web2py-users" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to web2py+un...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>> Resources: >>> - http://web2py.com >>> - http://web2py.com/book (Documentation) >>> - http://github.com/web2py/web2py (Source code) >>> - https://code.google.com/p/web2py/issues/list (Report Issues) >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "web2py-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to web2py+un...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > Resources: > - http://web2py.com > - http://web2py.com/book (Documentation) > - http://github.com/web2py/web2py (Source code) > - https://code.google.com/p/web2py/issues/list (Report Issues) > --- > You received this message because you are subscribed to the Google Groups > "web2py-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to web2py+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.