Не получаются записи, созданные в поле One2many onchange в переходной модели

Я пытаюсь создать записи в поле one2many в одной из моих временных моделей при замене логического поля.

Например.

модели

class test_model(models.TransientModel):
    _name ="test.model"

    is_okay = fields.Boolean("Okay?")
    lines = fields.One2many("opposite.model","test_id",string="Lines")

    @api.onchange('is_okay')
    def onchnage_is_okay(self):
        ids = []
        for l in range(5):
            record = self.env['opposite.model'].create({'name':str(l),'test_id':self.id})
            ids.append(record.id)
        self.lines = [(6,0,ids)]



class opposite_model(models.TransientModel):
    _name ="opposite.model"

    name = fields.Char("Name")
    test_id = fields.Many2one("test.model",string="Test Model")

Посмотреть

<record id="view_form" model="ir.ui.view">
    <field name="name">view.form</field> 
    <field name="model">test.model</field>
    <field name="type">form</field>
    <field name="arch" type="xml">
        <form string="Test Model">
           <field name="is_okay" />
           <field name="lines" />
           <footer>
            <button name ="click_okay" string="Okay" type="object"/>
           </footer>
       </form>
   </field>
</record>

Теперь проблема заключается в том, что при проверке или снятии отметки с поля is_okay он заполняет записи в поле One2many.

Это работает нормально.

Но в моем представлении выше у меня есть кнопка, которая вызывает метод click_okay(),

Например.

@api.one
def click_okay(self):
    print self.lines

Итак, оператор print дает мне пустой набор записей. Но я могу видеть 5 записей в представлении, когда я меняю поле is_okay.

Я не понимаю, как получить эти строки в методе?

Любой ответ будет оценен?

2 ответа

Он должен работать. Это проводное поведение.

Вы можете попробовать следующий альтернативный способ, используя self.update()

@api.onchange('is_okay')
def onchnage_is_okay(self):
    ids = []
    for l in range(5):
        record = self.env['opposite.model'].create({'name':str(l),'test_id':self.id})
        ids.append(record.id)
    self.update({
        'lines' : [(6,0,ids)]
    )}

Независимо от того, что odoo продолжает делать то же самое:

проблема в том, что odoo всегда передает эти записи, чтобы создать метод с командой 1 но в odoo мы не можем использовать эту команду в методе create, и поэтому вы теряете эти записи при вызове метода.

(1, id, values) обновляет существующую запись id id со значениями в значениях. Не может быть использовано в create().

я не знаю, почему вы создаете эту запись в onchange событие, потому что это не рекомендуется, если пользователь нажал кнопку "Закрыть", а не "ОК", запись все готово, созданная в базе данных, и каждый раз, когда он проверял кнопку, будет воссоздавать эту запись снова и снова.

если вам не нужно создавать эти записи в событии onchange, вам нужно сделать следующее:

@api.onchange('is_okay')
def onchnage_is_okay(self):
    ids = []
    for l in range(5):
        record = self.env['opposite.model'].new({'name': str(l)})
        ids.append(record.id)
    self.lines = ids

одна вещь здесь onchange вернет словарь в форму, дерево поля one2 должно иметь все поля, которые передаются в этом словаре, в этом случае дерево должно иметь поле name если oppisite.model например, другое поле test_field если мы пройдем {'name': value, 'test_field': value_2} если дерево есть только name значение поля test_field будет потеряно в методе создания.

но если вам нужно, как вы делаете, вы должны работать arround odoo и изменить команду на 4 при создании метода:

@api.model
def create(self, vals):
    """
    """
    lines = vals.get('lines', False)
    if lines:
        for line in lines:
            line[0] = 4
            line[2] = False
    vals.update({'lines': lines})
    return super(test_model, self).create(vals)
Другие вопросы по тегам