Глобальные переменные и контекст в 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, но им нужен идентификатор, который недоступен, потому что запись еще не сохранена.

Кроме того, можем ли мы назначить глобальную переменную, к которой можно получить доступ из любого класса в модуле (переменная сеанса в терминах веб-разработки)?


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) в javascript? - person user3261143; 03.02.2014
comment
да, это то же самое, что и getElementByID в javascript. Поле, которое вы хотите прочитать, чем вы можете получить с помощью vals.get('field_name'). Если ваше поле one2many или many2many, оно будет использовать цикл. - person Bhavesh Odedra; 03.02.2014
comment
Я пытался использовать vals в методе, но эта переменная определена только в методах создания и записи, иначе ее нужно передать в метод из другого метода. Не могли бы вы привести пример, пожалуйста? - person user3261143; 03.02.2014
comment
это не единственный способ сделать это. Например, сделайте одну кнопку и передайте значение в контексте. В методе Button вы получаете значение вроде context.get('field_name'). - person Bhavesh Odedra; 04.02.2014

Лучше переопределить метод create и использовать так, как вы хотите. Попробуйте это в своем объекте, это пример,

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