Odoo 如何通过小部件为特定字段设置默认值 many2many_binary
Odoo How to have a default value for a specific field via the widget many2many_binary
我在 res_partner 和 ir_attachement 之间有一个 many2many 字段是这样定义的:
class res_partner(osv.osv):
_inherit = 'res.partner'
_columns = {
'attachments_ids': fields.many2many('ir.attachment',
'res_partner_custom_ir_attachment_rel',
string=u"Custom attachments",
)
}
我还通过添加 'file_custom_type' 修改了 ir_attachment 模型:
class Attachment(osv.osv):
_inherit = 'ir.attachment'
_columns = {
'file_custom_type': fields.selection([("a", u"Type A"),
("b", u"Type B"),
("c", u"Type C"),
],
u"Custom file type")
}
这将使我能够按我的自定义类型重新组合附件,对我的附件进行排序,并且比仅在我的表单视图顶部使用 XXX 百个附件的下拉列表具有更清晰的视图。
所以我在 res_partner_form_view 中创建了一个笔记本:
<notebook position="inside">
<page string="Company attachments" attrs="{'invisible': [('is_company', '=', False)]}">
<group>
<field name='attachments_ids'
string="Attachment type A"
widget='many2many_binary'
domain="[('file_custom_type', '=', 'a')]"
context="{'default_file_custom_type': 'a'}"/>
<field name='attachments_ids'
string="attachment type B"
widget='many2many_binary'
domain="[('file_custom_type', '=', 'b')]"
context="{'default_file_custom_type': 'b'}"/>
<field name='attachments_ids'
string="attachment type C"
widget='many2many_binary'
domain="[('file_custom_type', '=', 'c')]"
context="{'default_file_custom_type': 'c'}"/>
</group>
</page>
</notebook>
但是有了这个,我遇到了很多问题:
问题 1:file_custom_type 永远不会保存
上下文不起作用:file_custom_type 从未按预期保存,它在数据库中保持空白(在我的服务器上使用 psql 请求验证)
问题 2:只有最后一次出现的字段保存在关系 table
中
当我使用表单视图上传图片时,图片保存在ir_attachmenttable中,这是我想要的。
但是,关系 table res_partner_custom_ir_attachment_rel
仅在 xml 中字段的最后一次出现时递增(在给定的代码中,它是“类型 c”,但如果我将类型 C 和类型 B 的字段互换,只有类型 B 会保存在关系 table.
中
这导致附件只显示在最下方的字段中(并且只显示在此字段中输入的附件)
错误可视化:
当我上传时:
当我刷新页面时:
问题 3:域不工作
正如您在上述问题中看到的那样,file_custom_type 未保存,但我在该字段上有一个域,但是,当域状态为它时,第 3 个仍在显示附件应该只显示 file_custom_type="c".
我认为最简单的解决方案是在 class 中创建三个字段并确保定义域
attachment_type_a = fields.(...., domain=[...])
这里要做的关键是对所有字段使用相同的关系名称和列名称,以确保它们将数据保存在相同的 table 无需创建三个关系 tables.
当您不关心域时,您可以保留 attachment_ids 访问所有附件。
我在 res_partner 和 ir_attachement 之间有一个 many2many 字段是这样定义的:
class res_partner(osv.osv):
_inherit = 'res.partner'
_columns = {
'attachments_ids': fields.many2many('ir.attachment',
'res_partner_custom_ir_attachment_rel',
string=u"Custom attachments",
)
}
我还通过添加 'file_custom_type' 修改了 ir_attachment 模型:
class Attachment(osv.osv):
_inherit = 'ir.attachment'
_columns = {
'file_custom_type': fields.selection([("a", u"Type A"),
("b", u"Type B"),
("c", u"Type C"),
],
u"Custom file type")
}
这将使我能够按我的自定义类型重新组合附件,对我的附件进行排序,并且比仅在我的表单视图顶部使用 XXX 百个附件的下拉列表具有更清晰的视图。
所以我在 res_partner_form_view 中创建了一个笔记本:
<notebook position="inside">
<page string="Company attachments" attrs="{'invisible': [('is_company', '=', False)]}">
<group>
<field name='attachments_ids'
string="Attachment type A"
widget='many2many_binary'
domain="[('file_custom_type', '=', 'a')]"
context="{'default_file_custom_type': 'a'}"/>
<field name='attachments_ids'
string="attachment type B"
widget='many2many_binary'
domain="[('file_custom_type', '=', 'b')]"
context="{'default_file_custom_type': 'b'}"/>
<field name='attachments_ids'
string="attachment type C"
widget='many2many_binary'
domain="[('file_custom_type', '=', 'c')]"
context="{'default_file_custom_type': 'c'}"/>
</group>
</page>
</notebook>
但是有了这个,我遇到了很多问题:
问题 1:file_custom_type 永远不会保存
上下文不起作用:file_custom_type 从未按预期保存,它在数据库中保持空白(在我的服务器上使用 psql 请求验证)
问题 2:只有最后一次出现的字段保存在关系 table
中当我使用表单视图上传图片时,图片保存在ir_attachmenttable中,这是我想要的。
但是,关系 table res_partner_custom_ir_attachment_rel
仅在 xml 中字段的最后一次出现时递增(在给定的代码中,它是“类型 c”,但如果我将类型 C 和类型 B 的字段互换,只有类型 B 会保存在关系 table.
这导致附件只显示在最下方的字段中(并且只显示在此字段中输入的附件)
错误可视化:
当我上传时:
当我刷新页面时:
问题 3:域不工作
正如您在上述问题中看到的那样,file_custom_type 未保存,但我在该字段上有一个域,但是,当域状态为它时,第 3 个仍在显示附件应该只显示 file_custom_type="c".
我认为最简单的解决方案是在 class 中创建三个字段并确保定义域
attachment_type_a = fields.(...., domain=[...])
这里要做的关键是对所有字段使用相同的关系名称和列名称,以确保它们将数据保存在相同的 table 无需创建三个关系 tables.
当您不关心域时,您可以保留 attachment_ids 访问所有附件。