ตัวแปรโกลบอลและบริบทใน openerp

สิ่งที่ฉันต้องทำคือเข้าถึงค่าของคอลัมน์ในโมดูลบางโมดูลก่อนที่จะบันทึก

ตัวอย่างเช่น หากเรามีโมดูลที่กำหนดไว้ดังนี้:

_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'),
}

คอลัมน์ทั้งหมดเหล่านี้แสดงด้วยตัวควบคุม เช่น กล่องข้อความ กล่องคำสั่งผสม กล่องกาเครื่องหมาย ฯลฯ

เมื่อเราเปิดมุมมองแบบฟอร์มในโหมดสร้าง บันทึกใหม่จะถูกสร้างขึ้นแต่ไม่ได้บันทึก และจะไม่รับรหัสในฐานข้อมูลจนกว่าเราจะคลิก (บันทึก)

คำถามคือวิธีเข้าถึงค่าของฟิลด์เหล่านั้น (ตัวควบคุม) ก่อนที่จะบันทึกและก่อนที่บันทึกปัจจุบันจะใช้รหัสใหม่

ฉันรู้เกี่ยวกับ self.browse และ self.search แต่พวกเขาต้องการ ID ที่ไม่สามารถใช้งานได้เนื่องจากยังไม่ได้บันทึกบันทึก

นอกจากนี้ เราสามารถกำหนดตัวแปรส่วนกลางที่สามารถเข้าถึงได้จากคลาสใดก็ได้ในโมดูล (ตัวแปรเซสชันในเงื่อนไขการพัฒนาเว็บ) ได้หรือไม่


person user3261143    schedule 03.02.2014    source แหล่งที่มา


คำตอบ (2)


หากคุณต้องการเข้าถึงฟิลด์นี้มากกว่าที่คุณจะต้องแทนที่วิธีการสร้างของ orm ตัวอย่างเช่น:

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)

หวังว่านี่จะช่วยคุณได้

person Bhavesh Odedra    schedule 03.02.2014
comment
บางทีฉันอาจไม่ได้อธิบายตัวเองให้ชัดเจนเพียงพอ สิ่งที่ฉันต้องการคือการเข้าถึงฟิลด์ต่างๆ และอาจทำการคำนวณบางอย่างระหว่างรันไทม์ ไม่ใช่แค่เมื่อฉันคลิกบันทึก ฉันเชื่อว่าการแทนที่วิธีการสร้างจะใช้ได้เฉพาะในขณะที่ฉันคลิก (บันทึก) และบันทึกจะเริ่มต้นการเดินทางไปยังฐานข้อมูล - person user3261143; 03.02.2014
comment
สร้างการเรียกเมธอดเพียงครั้งเดียว และคุณต้องการคำนวณมากกว่าที่เราจะแทนที่เมธอดการเขียนได้ และเช่นเดียวกับโค้ดวิธีการสร้างจะทำงาน และฉันอัปเดตคำตอบด้วยวิธีเขียน - person Bhavesh Odedra; 03.02.2014
comment
ขอบคุณสำหรับคำตอบ แต่ไม่มีให้อ่านค่าของฟิลด์ก่อนที่เราจะไปที่ฐานข้อมูลใช่ไหม บางอย่างเช่น (getElementByID) ในจาวาสคริปต์? - person user3261143; 03.02.2014
comment
ใช่ นี่เหมือนกับ getElementByID ใน javascrip สิ่งที่คุณต้องการอ่านฟิลด์มากกว่าที่คุณสามารถเข้าถึงได้โดย vals.get('field_name') หากฟิลด์ของคุณเป็น one2many หรือ many2many กว่านั้นจะเป็นการใช้การวนซ้ำ - person Bhavesh Odedra; 03.02.2014
comment
ฉันพยายามใช้ vals ในเมธอด แต่ตัวแปรนี้ถูกกำหนดไว้ในเมธอด create และ write เท่านั้น ไม่เช่นนั้นจะต้องส่งผ่านไปยังเมธอดจากวิธีอื่น คุณช่วยยกตัวอย่างหน่อยได้ไหม? - person user3261143; 03.02.2014
comment
มันไม่ใช่แค่วิธีการทำเช่นนั้นเท่านั้น ตัวอย่างเช่น สร้างปุ่มเดียวและส่งค่าตามบริบท ในวิธีการของ Button คุณจะได้รับค่าเช่น context.get('field_name') - person Bhavesh Odedra; 04.02.2014

แทนที่วิธีการสร้างที่ดีกว่า และใช้วิธีที่คุณต้องการ ลองสิ่งนี้ในวัตถุของคุณ มันเป็นตัวอย่าง

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)

ในทำนองเดียวกัน คุณสามารถทำการเปลี่ยนแปลงได้จากที่นี่ ดูค่าของ "vals" และ "context" ซึ่งจะเป็นประโยชน์กับคุณ

person Mansi    schedule 03.02.2014