Anthony, I just tested it again, form.widget.fieldname WORKS with _readonly. Earlier i had 'total' field defined in Field() with writable=True, somehow it didn't like it when i set this field _readonly= True. Thank you so much (also to Peter and Villas)!
(I changed the test table to invoice) In controller: row = db.invoice(1) form = SQLFORM(db.invoice, row, formstyle='table2cols') form.custom.widget.total['_readonly'] = True In view: {{=form.custom.begin}} Invoice Id: <div>{{=form.custom.widget.id}}</div> Customer: <div>{{=form.custom.widget.customer}} </div> Project Name: <div>{{=form.custom.widget.project_name}}</div> Total: <div>{{=form.custom.widget.total}}</div> {{=form.custom.submit}} {{=form.custom.end}} <script> jQuery(document).ready(function(){ jQuery('#invoice_project_name').change(function(){ var invoice_total = jQuery('#invoice_total').val(); alert("invoice_total = " + invoice_total); jQuery('#invoice_total').val('4000'); }); }); </script> On Tuesday, July 11, 2017 at 8:31:21 PM UTC+8, Rudy wrote: > > Hi Anthony, > > Sorry I was on another issue, took me away for 2 weeks from below matter. > Actually i have no issue using SQLFORM, SQLFORM.factory, now I tried custom > widget, it works well with dropdown box for customer field. The real goal > is.... I have a field "total" in the quotation, its value depends on the > sum of all individual items, user should not modify it manually, but I want > my javascript to update it when user changes the discount on > edit_quote.html page. So i defined this "total" field with writable=False, > but I couldn't retrieve the value using jQuery('#quotation_total').val(), > then I used Firefox Inspector to find out what HTML element it used, then i > used parseFloat(jQuery('#quotation_total__row').find(".col-sm-9").text()) > to retrieve the value, then my javascript replaced the value in the form in > the view, now I hit submit button, this 'total' field value doesn't get > sent to the server. I did many try and error, it seems writable=True make a > field disable instead of readonly. This is the whole reason why i used FORM > and INPUT to construct everything from scratch (actually quite painful), so > when I defined INPUT(.... _readonly='True'), i could retrieve the value > using jQuery('#quotation_total').val() and update it, submit the form also > sent the total value to the callback function. > > When i tried custom widget, the behavior was the same that submitting a > form didn't sent the non-writable field to server, I need some SERIOUS > HELP. Is there any way I can make the writable=False field readonly? > > Hi Peter, thanks for taking time out to share your the SQLFORM.factory() > insight, there is no waste of time at all. > > On Monday, June 26, 2017 at 10:00:15 PM UTC+8, Anthony wrote: >> >> You do not need to use FORM() and INPUT() helpers just because you need >> to construct some custom markup for the form. Instead, use SQLFORM as usual >> and use the form.custom.widget widgets it generates to compose your >> form, as described here: >> http://web2py.com/books/default/chapter/29/07/forms-and-validators#Custom-forms. >> >> You can use those widgets either in the view within custom HTML (as shown >> in the book), or inside the FORM() helper if you really prefer that method. >> >> You can also generate just the SELECT widget as follows: >> >> SQLFORM.widgets.options.widget(db.quotation.customer, quote_row.customer) >> >> Anthony >> >> On Thursday, June 22, 2017 at 6:34:54 AM UTC-4, Rudy wrote: >>> >>> Hi there, >>> >>> Due to the javascript reason, i need to create a form using FORM and >>> INPUT helper. I wonder how I can create a form using these helpers with >>> field displaying a dropdown list for selection (of customer from quotation >>> form)? Below is a simplified version, currently i created autocomplete to >>> display a list of customer names matched the input text while user is >>> typing. Thanks in advance! >>> >>> db.define_table('customer', >>> Field('customer_name', requires=[IS_NOT_EMPTY()]), >>> format='%(customer_name)s') >>> db.define_table('quotation', >>> Field('customer', 'reference customer'), >>> Field('project_name', requires=IS_NOT_EMPTY()), >>> Field('total', 'double', default=0), >>> auth.signature) >>> >>> quote_row = db.quotation(id) >>> quotation_form = FORM( >>> 'Quotation id:', INPUT(_type='number', _name='id', >>> _value=quote_row.id, _id='quotation_id', _readonly='True', >>> requires=IS_NOT_EMPTY()),BR(), >>> >>> #'Customer Name:', INPUT(_type='number', >>> _name='customer', _value=quote_row.customer, _id='quotation_customer', >>> requires=IS_IN_DB(db, 'customer.id', '%(customer_name)s')),BR(), >>> DIV(_style="position: absolute;", _id="suggestions", >>> _class="suggestions"), BR(), >>> 'Customer Name:', INPUT(_type='text', _name='customer', >>> _value=db.customer(quote_row.customer).customer_name, >>> _id='quotation_customer', requires=IS_IN_DB(db, 'customer.id', >>> '%(customer_name)s')),BR(), DIV(_style="position: absolute;", >>> _id="suggestions", _class="suggestions"), BR(), >>> >>> 'Project Name:', INPUT(_type='text', >>> _name='project_name', _value=quote_row.project_name, >>> _id='quotation_project_name'),BR(), >>> 'Total:', INPUT(_type='number', _step='0.01', >>> _name='total', _value=quote_row.total, _id='quotation_total', >>> _readonly='True'),BR(), >>> INPUT(_type='submit')) >>> >> -- 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.