我正在测试我在Odoo 16中开发的Odoo 15模块,我使用了很多方法
fields_views_get
来具有一些行为来注入域和上下文,然后渲染组件,但目前我找不到这个方法。
这里有人知道在运行时实现某些行为的替代方法是什么(使用
etree
的 lxml
组件修改 XML)?
这里的主要目标是注入 XML 数据,如果没有
env
对象,很难添加这些数据,因为使用 fields_views_get
我能够在返回 XML 之前注入或进行查询。
fields_view_get
更名为get_view
:
变为fields_view_get
。 由于它不再返回字段描述, 将get_view
保留在fields
名称中不再有意义。 因此从方法名称中删除fields_view_get
,它就变成了fields
。 无论如何,它被重命名了,我们借此机会重命名它view_get
, 这更符合一般的 getter/setter 指南 在模型对象世界中。get_view
-变为_fields_view_get
。出于与上述相同的原因。_get_view
-变为load_views
。get_views
您可以在 refactor fields_view_get, load_views commit
中找到更多详细信息在更改的文件中,您可以看到 res_users 模型的提交差异示例,它替换为:
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
与:
def get_view(self, view_id=None, view_type='form', **options):
基本视图通常共享下面定义的通用结构。占位符全部大写:
<record id="MODEL_view_TYPE" model="ir.ui.view">
<field name="name">NAME</field>
<field name="model">MODEL</field>
<field name="arch" type="xml">
<VIEW_TYPE>
<VIEW_SPECIFICATIONS/>
</VIEW_TYPE>
</field>
</record>
在 Odoo 16.0 中,fields_views_get 方法已重命名为 get_view。此方法返回给定视图的 fields_views,以及当前模型的字段,以及可选的给定操作的过滤器。您可以使用此方法在渲染 XML 视图之前对其进行修改,就像在 Odoo 15.0 中使用 fields_views_get 所做的那样。
例如,如果要向表单视图中的字段注入域和上下文,可以重写模型中的 get_view 方法并使用 lxml 的 etree 组件来操作 XML 视图。这是示例代码:
from odoo import models
from lxml import etree
class TestModel(models.Model):
_name = "test.model"
_inherit = "test.model"
def get_view(self, views, options=None):
# call super to get the original view
result = super().get_view(views, options)
# loop through the views
for view in result.get("fields_views", {}).values():
# check if the view type is form
if view["type"] == "form":
# parse the XML view
doc = etree.XML(view["arch"])
# find the field that you want to modify
field = doc.xpath("//field[@name='your_field_name']")
if field:
# inject your domain and context
field[0].set("domain", "[('your_domain', '=', True)]")
field[0].set("context", "{'your_context': 'value'}")
# update the view arch with the modified XML
view["arch"] = etree.tostring(doc, encoding="unicode")
return result