2015-07-07 22 views
5

Jak dokonać edycji pola funkcjonalnego w Openerp?Czy można edytować pole funkcyjne w Openerp?

Kiedy tworzymy

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

To będzie wyświetlany jest tylko do odczytu i możemy nie móc edytować tekst.

W jaki sposób sprawiamy, że to pole jest edytowalne?

+1

która wersja odoo pracujesz? –

+0

Openerp wersja 7 –

Odpowiedz

2

Musisz dodać funkcję odwrotną, aby pole było edytowalne. Ten parametr nazywa się fnct_inv w OpenERP v7. Przykład:

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, 
    ), 
} 
+3

Czy jesteś pewien, że ręcznie wstawiona wartość nie zostanie nadpisana i utracona przy następnym ponownym obliczeniu? –

+0

Masz rację, zamierzam edytować moją odpowiedź. Używasz Odoo 8 API w swojej odpowiedzi, ale zamierzam użyć API OpenERP v7, ponieważ osoba, która pytała, używa OpenERP 7. – ChesuCR

6

Obliczone pole ma funkcję, która automatycznie oblicza jego wartość na niektórych danych źródłowych.

Można dodać operację odwrotną, aktualizując dane źródłowe na podstawie ręcznie ustawionej wartości, co umożliwia edycję.

Z documentation:

aby umożliwić ustawienie wartości na polu komputerowej, należy użyć parametru odwrotny. Jest to nazwa funkcji cofania obliczenie i ustawienie odpowiednich pól:

Przykładowy kod:

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)