Variabel global dan konteks di openerp

Yang perlu saya lakukan adalah mengakses nilai kolom dalam modul tertentu sebelum disimpan.

Misalnya, jika kita mempunyai modul yang didefinisikan seperti ini:

_columns = {
    'name': fields.char('Department Name', size=64, required=True),
    'complete_name': fields.function(_dept_name_get_fnc, type="char", string='Name'),
    'parent_id': fields.many2one('hr.department', 'Parent Department', select=True),
    'child_ids': fields.one2many('hr.department', 'parent_id', 'Child Departments'),
    'note': fields.text('Note'),
}

Semua kolom tersebut diwakili oleh kontrol seperti kotak teks, kotak kombo, kotak centang, dll.

Saat kita membuka tampilan formulir dalam mode buat, catatan baru sedang dibuat tetapi tidak disimpan dan tidak akan mengambil id di database sampai kita klik (simpan).

Pertanyaannya adalah bagaimana cara mengakses nilai bidang tersebut (kontrol) sebelum disimpan dan sebelum catatan saat ini mengambil id baru.

Saya tahu tentang self.browse dan self.search tetapi mereka memerlukan ID yang tidak tersedia karena catatannya belum disimpan.

Selain itu, bisakah kita menetapkan variabel global yang dapat diakses dari kelas mana pun dalam modul (variabel sesi dalam istilah pengembangan web)?


person user3261143    schedule 03.02.2014    source sumber


Jawaban (2)


Jika Anda ingin mengakses bidang ini maka Anda perlu mengganti metode pembuatan orm. Misalnya:

def create(self, cr, uid, vals, context=None):
    name = vals.get('name')
    complete_name = vals.get('complete_name') # like all others field if one2many field comes than this field access using for loop.

    vals.update({'your_field_name': your_value_what_you_want_to_update_before_creating})
    #vals.update({'name': 'Your Good Name'})

    return super(your_class_name, self).create(cr, uid, vals, context)

def write(self, cr, uid, ids, vals, context=None):
    print "\n\n\nCurrent Values =>", vals
    name = vals.get('name')
    print "\nCurrent Name => ", name
    complete_name = vals.get('complete_name') # like all others field if one2many field comes than this field access using for loop.

    #do all calculation as you want and store in local variable and that variable pass as a value. for example.  
    name = 'Your Good Name'
    vals.update({'name': name})

    print "\n\nUpdated Values => ", vals 

    return super(your_class_name, self).write(cr, uid, ids, vals, context)

Semoga ini bisa membantu Anda.

person Bhavesh Odedra    schedule 03.02.2014
comment
Mungkin saya kurang menjelaskannya, yang saya perlukan adalah mengakses kolom dan mungkin membuat beberapa perhitungan saat runtime bukan hanya saat saya mengklik simpan. Saya percaya bahwa mengganti metode buat hanya akan berfungsi pada saat saya mengklik (Simpan) dan catatan memulai perjalanannya ke database. - person user3261143; 03.02.2014
comment
Buat pemanggilan metode hanya satu kali dan Anda ingin melakukan beberapa penghitungan sehingga kami dapat mengganti metode tulis. dan Lakukan hal yang sama seperti membuat kode metode akan berfungsi. Dan saya memperbarui jawaban saya dengan metode tulis. - person Bhavesh Odedra; 03.02.2014
comment
Terima kasih atas jawabannya, tetapi bukankah ada cara untuk membaca nilai kolom sebelum kita masuk ke database? sesuatu seperti (getElementByID) dalam javascript? - person user3261143; 03.02.2014
comment
ya, ini sama dengan getElementByID di javascript. Bidang apa yang ingin Anda baca kemudian dapat Anda akses dengan vals.get('field_name'). Jika bidang Anda adalah one2many atau many2many maka bidang tersebut akan menggunakan loop. - person Bhavesh Odedra; 03.02.2014
comment
Saya mencoba menggunakan vals dalam suatu metode tetapi variabel ini hanya didefinisikan dalam metode buat dan tulis, jika tidak maka harus diteruskan ke metode dari metode lain. Tolong beri contoh? - person user3261143; 03.02.2014
comment
ini bukan satu-satunya cara untuk melakukannya. Misalnya membuat satu tombol dan memberikan nilai dalam konteks. Dalam metode Tombol Anda mendapatkan nilai seperti konteks.dapatkan('nama_bidang'). - person Bhavesh Odedra; 04.02.2014

Lebih baik ganti metode pembuatan, dan gunakan sesuai keinginan Anda. Coba ini di objek Anda, Ini contohnya,

def create(self, cr, uid, vals, context=None):
    if vals.get('name','/')=='/':
        vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'sale.order') or '/'
    return super(sale_order, self).create(cr, uid, vals, context=context)

Anda juga dapat melakukan perubahan dari sini sendiri, lihat nilai "vals" dan "konteks", ini akan membantu Anda.

person Mansi    schedule 03.02.2014