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 [email protected].
For more options, visit https://groups.google.com/d/optout.