Make a functional field editable in Openerp?

╄→尐↘猪︶ㄣ 提交于 2019-12-07 03:26:40

问题


How to make functional field editable in Openerp?

When we create

'capname': fields.function(
    _convert_capital, string='Display Name', type='char', store=True
),

This will be displayed has read-only and we can't able to edit the text.

How we make this field has editable?


回答1:


You must add a inverse function to make the field editable. This parameter is called fnct_inv in OpenERP v7. An example:

def _get_test(self, cr, uid, ids, name, args=None, context=None):
    result = dict.fromkeys(ids, False)
    for line in self.browse(cr, uid, ids, context=context):
        if line.test:
            result[line.id] = line.test
    return result       

def _set_test(self, cr, uid, id, field_name, field_value, args=None, context=None):
    obj = self.browse(cr, uid, id)
    for record in obj:
        if record.test != field_value:
            # The record already exists

            ...

            cr.execute(
                'UPDATE your_table '
                'SET test=%s '
                'WHERE id=%s', (field_value, id)
            )
        else:
            # It is a new record 
            # (or the value of the field was not modified)

    return True

_columns = {
    'test': fields.function(
        string='String for testing', 
        fnct=_get_test, 
        fnct_inv=_set_test,            
        type='char', 
        size=50, 
        store=True,
    ),
}



回答2:


A computed field has a function that automatically calculates it's value on some source data.

It is possible to add it the inverse operation, updating the source data based on a value manually set on it, thus making it editable.

From the documentation:

to allow setting values on a computed field, use the inverse parameter. It is the name of a function reversing the computation and setting the relevant fields:

Example code:

document = fields.Char(compute='_get_document', inverse='_set_document')

def _get_document(self):
    for record in self:
        with open(record.get_document_path) as f:
            record.document = f.read()
def _set_document(self):
    for record in self:
        if not record.document: continue
        with open(record.get_document_path()) as f:
            f.write(record.document)


来源:https://stackoverflow.com/questions/31267793/make-a-functional-field-editable-in-openerp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!