Specify the views you want to use

在几种情况下你相比于默认的视图更想用指定的视图:

  • 如果一个对象有好几种表单或是列表视图。

  • 如果你想要通过使用关系字段(如one2many)来更改表单或是列表视图。

Using the priority field

这个字段在视图定义中是可用的,默认为16。在默认情况下,OpenERP用最高优先级(更小的值)的视图来显示model。比如,想象我们的一个model有两个视图。model client有两个字段:firstname和lastname。我们将会定义两个视图,一个用于首先显示firstname,另一个用于首先显示lastname。

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  1. <!—
  2. Here is the first view for the model ‘client’.
  3. We don’t specify a priority field, which means
  4. by default 16.
  5. —>
  6. <record model=”ir.ui.view” id=”client_form_view_1”>
  7. <field name=”name”>client.form.view1</field>
  8. <field name=”model”>client</field>
  9. <field name=”type”>form</fiel>
  10. <field name=”arch” type=”xml”>
  11. <form>
  12. <field name=”firstname”/>
  13. <field name=”lastname”/>
  14. </form>
  15. </field>
  16. </record>
  17. <!—
  18. A second view, which show fields in an other order.
  19. We specify a priority of 15.
  20. —>
  21. <record model=”ir.ui.view” id=”client_form_view_2”>
  22. <field name=”name”>client.form.view2</field>
  23. <field name=”model”>client</field>
  24. <field name=”priority” eval=”15”/>
  25. <field name=”type”>form</fiel>
  26. <field name=”arch” type=”xml”>
  27. <form>
  28. <field name=”lastname”/>
  29. <field name=”firstname”/>
  30. </form>
  31. </field>
  32. </record>

现在,OpenERP每次为对象client显示表单视图,它都有两个视图选择。它一直选择的是第二个,因为这个有高优先级。除非你告诉它选择第一个。

Specify per-action view

为了说明这一点,我们将会创建2个菜单来为client对象显示表单视图。

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  1. <!—
  2. This action open the default view (in our case,
  3. the view with the highest priority, the second one)
  4. —>
  5. <record
  6. model=”ir.actions.act_window”
  7. id=”client_form_action”>
  8. <field name=”name”>client.form.action</field>
  9. <field name=”res_model”>client</field>
  10. <field name=”view_type”>form</field>
  11. <field name=”view_mode”>form</field>
  12. </record>
  13. <!—
  14. This action open the view we specify.
  15. —>
  16. <record
  17. model=”ir.actions.act_window”
  18. id=”client_form_action1”>
  19. <field name=”name”>client.form.action1</field>
  20. <field name=”res_model”>client</field>
  21. <field name=”view_type”>form</field>
  22. <field name=”view_mode”>form</field>
  23. <field name=”view_id” ref=”client_form_view_1”/>
  24. </record>
  25. <menuitem id=”menu_id” name=”Client main menu/>
  26. <menuitem
  27. id=”menu_id_1”
  28. name=”Here we dont specify the view
  29. action=”client_form_action” parent=”menu_id”/>
  30. <menuitem
  31. id=”menu_id_1”
  32. name=”Here we specify the view
  33. action=”client_form_action1” parent=”menu_id”/>

你可以看到第19行,我们特定了一个视图。这意味着当我们打开第二个菜单时,OpenERP将会使用视图client_form_view_1,而不管它的优先级。

注解

Remember to use the module name (module.view_id) in the ref attribute if you are referring to a view defined in another module.

Specify views for related fields

Using the context

view_id方法对于menus/actions效果很好,但是你如何为one2many字段特定视图呢?当你有一个one2many字段时,将会使用两个视图,一个列表视图(蓝色的),和一个表单视图(红色的,当你点击添加按钮时就会显示出)。

/doc_static/5.0/_images/one2many_views.png

当你添加一个one2many字段在表单视图中时,你会这么做:

  1. <field name="order_line" colspan="4" nolabel="1"/>

当你想要使用指定的视图时,你可以添加一个context属性,并且为每个支持的视图类型指定一个view id,就像action的view_id属性:

  1. <field name="order_line" colspan="4" nolabel="1"
  2. context="{'form_view_ref' : 'module.view_id', 'tree_view_ref' : 'model.view_id'}"/>

如果你不想指定视图,OpenERP将会在以下的order中选择一个:

  1. 它会使用定义了inside字段的

    视图。

  2. 不然,它会使用这个对象最高优先级的视图。

  3. 最后,它会产生拥有所有字段的默认空视图。

注解

The context keys are named _view_ref.

注解

By default, OpenERP will never use a view that is not defined for your object. If you have two models, with the same fields, but a different model name, OpenERP will never use the view of one for the other, even if one model inherit an other.

You can force this by manually specifying the view, either in the action or in the context.

Using subviews

对于相关的字段,你可以直接在一个字段中创建一个视图:

  1. <record model="ir.ui.view" id="some_view">
  2. <field name="name">some.view</field>
  3. <field name="type">form</field>
  4. <field name="model">some.model.with.one2many</field>
  5. <field name="arch" type="xml">
  6. <form>
  7. <field name="..."/>
  8. <!-- <=== order_line is a one2many field -->
  9. <field name="order_line" colspan="4" nolabel="1">
  10. <form>
  11. <field name="qty"/>
  12. ...
  13. </form>
  14. <tree>
  15. <field name="qty"/>
  16. ...
  17. </tree>
  18. </field>
  19. </form>
  20. </field>

如果你或是其他的开发人员想要在其他的module中继承这个视图,你需要继承父类视图并且修改子类字段。对于子类视图,你需要使用XPath Element来直接描述想要在哪里存放你的新字段。

  1. <record model="ir.ui.view" id="some_inherited_view">
  2. <field name="name">some.inherited.view</field>
  3. <field name="type">form</field>
  4. <field name="model">some.model.with.one2many</field>
  5. <field name="inherit_id" ref="core_module.some_view"/>
  6. <field name="arch" type="xml">
  7. <data>
  8. <xpath
  9. expr="//field[@name='order_line']/form/field[@name='qty']"
  10. position="after">
  11. <field name="size"/>
  12. </xpath>
  13. <xpath
  14. expr="//field[@name='order_line']/tree/field[@name='qty']"
  15. position="after">
  16. <field name="size"/>
  17. </xpath>
  18. </data>
  19. </field>

像这样定义一个subview的副作用是,它不能继承自它自己,它只能继承自父类视图。如果你单独定义了子类视图并且指定哪个子类视图来作为one2many字段的一部分使用,这样你的视图将会非常灵活。