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.

Reply via email to