从Odoo 17.0开始,attrs
和states
属性不再使用,取而代之的是使用depends
和domain
属性来控制字段的可见性和其他行为。如果您想要在选择国家之后继续选择州,并且希望在选择了国家之后才显示州字段,您可以使用depends
属性来实现这一点。
以下是如何在Odoo 17.0及更高版本中实现这个功能的步骤:
1. 更新模型定义
在group_send.user
模型中定义两个字段:一个用于国家,一个用于州。
from odoo import models, fieldsclass 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及更高版本中实现在选择国家之后继续选择州的功能。