Не получаются записи, созданные в поле 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)