从Odoo 17.0开始,attrs
和states
属性不再使用,取而代之的是使用depends
和domain
属性来控制字段的可见性和其他行为。如果您想要在选择国家之后继续选择州,并且希望在选择了国家之后才显示州字段,您可以使用depends
属性来实现这一点。
以下是如何在Odoo 17.0及更高版本中实现这个功能的步骤:
1. 更新模型定义
在group_send.user
模型中定义两个字段:一个用于国家,一个用于州。
from odoo import models, fields
class GroupSendUser(models.Model):
_name = 'group_send.user'
_description = 'Group Send User'
# 其他字段...
country_id = fields.Many2one('res.country', string='Country')
state_id = fields.Many2one('res.country.state', string='State/Province', depends=['country_id'])
2. 修改视图定义
在表单视图中添加这两个字段,并使用domain
属性来控制州字段的可见性。
<record id="group_send_form_view" model="ir.ui.view">
<field name="name">group_send.user.form</field>
<field name="model">group_send.user</field>
<field name="arch" type="xml">
<form string="Group Send">
<sheet>
<group>
<field name="name"/>
<field name="country_id" options="{'no_create': True}"/>
<field name="state_id" domain="[('country_id', '=', country_id)]" />
<!-- 其他字段 -->
</group>
</sheet>
</form>
</field>
</record>
3. 定义on_change
方法
在模型中定义on_change
方法,当国家改变时,根据选择的国家更新州的选项。
class GroupSendUser(models.Model):
# ...其他方法和字段...
def on_change_country(self, country_id):
if not country_id:
return {'value': {'state_id': False}}
state_ids = self.env['res.country.state'].search([('country_id', '=', country_id)])
return {
'value': {
'state_id': state_ids and state_ids[0].id or False
}
}
4. 注册on_change
方法
在模型中注册on_change
方法,以便在国家字段变更时自动调用。
# 在类定义中添加
@api.onchange('country_id')
def on_change_country(self):
if self.country_id:
return self.on_change_country(self.country_id.id)
注意事项
- 确保您的Odoo系统已经安装了标准国家和州/省的列表,或者您有自定义的州/省列表。
on_change
方法提供了一个简单的国家变更时的响应,您可能需要根据实际业务逻辑调整这个方法。- 级联效应(如
on_change
)可能会影响性能,尤其是在数据量大时,因此请确保合理使用。
按照这些步骤,您应该能够在Odoo 17.0及更高版本中实现在选择国家之后继续选择州的功能。