Как я могу получить запись в методе fields_view_get, когда я перехожу в представление формы из древовидного представления

Это мой первый вопрос о переполнении стека, и мой английский не очень хорош. Надеюсь, вы меня понимаете.

Цель: я хочу динамически изменять представление формы в зависимости от состояния записи.

Проблема: я не могу получить запись или active_id записи, когда я вхожу в представление формы из представления в виде дерева. Но я могу получить его, если обновлю представление формы напрямую.

Весь день мучился с этой проблемой. И я нахожу некоторые ответы, но они недостаточно подробны:

  1. Добавьте идентификатор выбранной записи в контекст, когда кто-то щелкнул запись в представлении в виде дерева, и вы можете получить идентификатор в методе fields_view_get по контексту. Но ответ не говорит нам, как добавить идентификатор в контекст, когда я нажимаю кнопку запись в виде дерева.
  2. используйте метод чтения:

    @api.multi def read(self, fields=None, load='_classic_read'):

    Я не могу этого понять.

Спасибо


person 赵新岭    schedule 23.11.2017    source источник
comment
в древовидном представлении вы не можете получить active_id, но active_ids.   -  person Rinaldi    schedule 23.11.2017
comment
И как я могу получить id выбранной записи?   -  person 赵新岭    schedule 23.11.2017


Ответы (1)


На данный момент единственный способ получить идентификатор записи — сохранить его в контексте:

я не смог найти для вас простого решения, но если это срочно, вы можете сделать что-то вроде этого:

 1 - define an action that opens the record in tree or kanban view without form
 2 - add a button in the tree view to force the use to open the record from there if
     he want to edit it.
 3 - that button calls a method in your model to open that record in form view
 4 - in the context add the id of that record with special key
 5 - in your fields_view_get  check if that key is in the context and change the form
     arch from there

действие:

<record model="ir.actions.act_window" ...>
      .....
      .....
      <field name="view_mode">tree</field>
      ...
</record>

дерево:

   <record model="ir.ui.view">
     ....
     ....
     ....
       <tree>
           ...
           ...
           <button name="open_rec" type="object" ..../>
       </tree>
    </record>

в модели:

 @api.multi
 def open_rec(self):
    # return an window action
    form_id = self.env.ref('module_name.form_xml_id').id
    context = self.env.context
    context.update({'current_rec': self.id} # change context to add rec id
    return {
        'name': _('Title'),
        'type': 'ir.actions.act_window',
        'view_type': 'form',
        'view_mode': 'form',
        'res_model': 'model.name',
        'view_id': form_id,
        'target': 'current',
        'context': context,
    }


@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
    result = super(YourClass, self).fields_view_get(view_id, view_typ, toolbar, submenu)
    if context.get('current_rec') and view_type='form':
        # this is when you need to change the resutl

Надеюсь, это поможет вам, если вы найдете лучший способ опубликовать его.

person Charif DZ    schedule 23.11.2017
comment
Да, пожалуй, лучшее решение. Спасибо большое. - person 赵新岭; 30.11.2017
comment
Могу ли я достичь цели установки атрибута поля на основе значения записи через QWEB? - person 赵新岭; 30.11.2017
comment
Если вы имеете в виду шаблон xml представления, да, вы можете. Поскольку у вас будет доступ к арочному полю представления, и это xml, вы можете изменить там все, что захотите. - person Charif DZ; 30.11.2017