Search code examples
odooodoo-10odoo-view

Load Country -> State -> City depencency in Odoo


How can we create dependent selection of Country->State->City in Odoo?

  • For example -
    • Selected Country = United States
      • which will load All state of US
    • State = Texas, California, Ohio, .. etc,
      • Selected state = Texas
      • On Selection of State, it will load all Cities in selected state.
    • City = Austin, Huston, ..etc.

How can we achieve this in Odoo?

I have created below code in model.py

country = fields.Many2one('res.country',string='Country', help='Select Country')
state = fields.Many2one('state.country',string='State', help='Enter State')
city = fields.Char('City', help='Enter City')

view.xml file is having just below code:

<field name="country"/>
<field name="state"/>
<field name="city"/>

Solution

  • state_id = fields.Many2one("res.country.state", string='State', help='Enter State', ondelete='restrict')
    country_id = fields.Many2one('res.country', string='Country', help='Select Country', ondelete='restrict')    
    city = fields.Char('City', help='Enter City')
    hide = fields.Boolean(string='Hide', compute="_compute_hide")
    
    # Dependent picklist code to show State based on selected Country E.g India -> Gujarat, Maharastra, Rajasthan, etc..
    @api.onchange('country_id')
    def _onchange_country_id(self):
        if self.country_id:
            return {'domain': {'state_id': [('country_id', '=', self.country_id.id)]}}
        else:
            return {'domain': {'state_id': []}}
    
    # Show Hide State selection based on Country
    @api.depends('country_id')
    def _compute_hide(self):
        if self.country_id:
            self.hide = False
        else:
            self.hide = True
    
    # view.xml
    <field name="hide" invisible="1"/>
    <field name="country_id" options="{'no_quick_create': True, 'no_create_edit' : True}"/>
    <field name="state_id" options="{'no_quick_create': True, 'no_create_edit' : True}" attrs="{'invisible':[('hide', '=', True)]}"/>
    <field name="city"/>