ODOO标准视图和QWEB视图国家省城市三级联动

发布时间 2023-05-01 15:37:52作者: CrossPython

odoo标准视图国家省城市三级联动:代码如下

country_bank = fields.Many2one('res.country', '开户行国家', ondelete='restrict')
province_bank = fields.Many2one('res.country.state', '开户行省份', ondelete='restrict')
city_bank = fields.Many2one('res.city', '开户行城市', ondelete='restrict')
 
# 开户行国家省联动
@api.onchange('country_bank')
def onchange_country_bank(self):
    # 当国家改变时,清空开户行省份和市
    self.province_bank = False
    self.city_bank = False
    if self.country_bank:
        return {'domain': {'province_bank': [('country_id', '=', self.country_bank.id)]}}
    else:
        return {'domain': {'province_bank': []}}
# 开户行省城市联动
@api.onchange('province_bank')
def _onchange_province_bank(self):
    self.city_bank = False
    if self.province_bank:
        return {'domain': {'city_bank': [('state_id', '=', self.province_bank.id)]}}
    else:
        return {'domain': {'city_bank': []}}

  

Qweb视图国家省城市三级联动:代码如下

# Qweb页面根据页面选择的开户行国家带出开户省份
@api.model
def get_bank_states_by_country(self):
    ctx = self._context.copy()
    # 获取开户行国家的id
    bank_country_id = ctx.get('bank_country_id', False)
    bank_state_ids = []
    if bank_country_id:
        # 通过国家id获取省份记录集
        states =self.env['res.country.state'].sudo().search([('country_id', '=', int(bank_country_id))])
        bank_state_ids.append({'id': 0, 'name': '请选择'})
        for i in states:
            bank_state_ids.append({
                'id': i.id,
                'name': i.name
            })
    return bank_state_ids
 
 
# Qweb页面根据页面选择的开户行省份带出开户行城市
@api.model
def get_bank_citys_by_state(self):
    ctx = self._context.copy()
    bank_state_id = ctx.get('bank_state_id', False)
    bank_city_ids = []
    if bank_state_id:
        citys = self.env['res.city'].sudo().search([('state_id', '=', int(bank_state_id))])
        for i in citys:
            bank_city_ids.append({
                'id': i.id,
                'name': i.name
            })
    return bank_city_ids
 
Qweb页面:
<div class="col-lg-3 col-md-8">
    <select t-att-readonly="'readonly' if is_view else None" class="form-control o_website_form_input" name="country_id" id="supplier_info_country_id">
      <option value="请选择">请选择</option>
      <t t-foreach="countrys" t-as="country">
        <option t-att-data="country.id" t-att-value="country.id" t-att-selected="country.id == supplier.country_id.id"><t t-esc="country.name"/></option>
      </t>
    </select>
</div>
 
<div class="col-lg-3 col-md-8">
  <select t-att-readonly="'readonly' if is_view else None" class="form-control o_website_form_input" name="state_id" id="supplier_info_state_id">
     <option value="请选择">请选择</option>
     <t t-foreach="states or []" t-as="state">
        <option class="state" t-att-value="state.id" t-att-country="state.country_id.id" t-att-selected="state.id == supplier.state_id.id">
            <t t-esc="state.name"/>
        </option>
     </t>
    </select>
</div>
 
<div class="col-lg-3 col-md-8">
  <!--<input type="text" class="form-control o_website_form_input" t-att-value="supplier.city" name="city"/>-->
   <select t-att-readonly="'readonly' if is_view else None" class="form-control o_website_form_input" name="city" id="supplier_info_city">
     <option value="请选择">请选择</option>
     <t t-foreach="citys or []" t-as="city">
        <option class="city" t-att-value="city.id" t-att-state="city.state_id.id" t-att-selected="city.id == supplier.city.id">
            <t t-esc="city.name"/>
        </option>
     </t>
   </select>
</div>
 
js文件(远程调用后台方法):static\src\js\register.js
odoo.define('e2yun_supplier_info.base_info', function (require) {
"use strict";
    $(document).ready(function() {
        $('#supplier_info_country_id').on('change',function(){  --国家发生改变时调用该方法
            var rpc = require('web.rpc');  --------------------远程调用
            var country_id = $("#supplier_info_country_id").val(); --------取出标签值
            var blog_id = $("input[name='blog_post_id']").val();
            rpc.query({   -------------------------------------查询
                model: 'e2yun.supplier.info',
                method: 'get_states_by_country',
                args:[{'country_id':country_id}]  
            }).then(function(state_ids){
                var select_state_id = $('#supplier_info_state_id');
                select_state_id.html('')
                if(state_ids && state_ids.length > 0){
                    _.each(state_ids, function (x) {
                        var opt = $('<option>').text(x.name)
                            .attr('value', x.id);
                            select_state_id.append(opt);
                    });
                }else{
                    var opt = $('<option>').text('')
                        .attr('value', '');
                        select_state_id.append(opt);
                }
            });
        })
    });
    $(document).ready(function() {
        $('#supplier_info_state_id').on('change',function(){
            var rpc = require('web.rpc');
            var state_id = $("#supplier_info_state_id").val();
            var blog_id = $("input[name='blog_post_id']").val();
            rpc.query({
                model: 'e2yun.supplier.info',
                method: 'get_citys_by_state',
                args:[{'state_id':state_id}]
            }).then(function(city_ids){
                var select_city_id = $('#supplier_info_city');
                select_city_id.html('')
                if(city_ids && city_ids.length > 0){
                    _.each(city_ids, function (x) {
                        var opt = $('<option>').text(x.name)
                            .attr('value', x.id);
                            select_city_id.append(opt);
                    });
                }else{
                    var opt = $('<option>').text('')
                        .attr('value', '');
                        select_city_id.append(opt);
                }
            });
        })
    })
    $(document).ready(function() {
        $('#supplier_info_bank_country').on('change',function(){
            var rpc = require('web.rpc');
            var bank_country_id = $("#supplier_info_bank_country").val();
            var blog_id = $("input[name='blog_post_id']").val();
            rpc.query({
                model: 'e2yun.supplier.info',
                method: 'get_bank_states_by_country',
                args:[{'bank_country_id':bank_country_id}]
            }).then(function(bank_state_ids){
                var select_bank_state_id = $('#supplier_info_bank_state');
                select_bank_state_id.html('')
                if(bank_state_ids && bank_state_ids.length > 0){
                    _.each(bank_state_ids, function (x) {
                        var opt = $('<option>').text(x.name)
                            .attr('value', x.id);
                            select_bank_state_id.append(opt);
                    });
                }else{
                    var opt = $('<option>').text('')
                        .attr('value', '');
                        select_bank_state_id.append(opt);
                }
            });
        })
    });
    $(document).ready(function() {
        $('#supplier_info_bank_state').on('change',function(){
            var rpc = require('web.rpc');
            var bank_state_id = $("#supplier_info_bank_state").val();
            var blog_id = $("input[name='blog_post_id']").val();
            rpc.query({
                model: 'e2yun.supplier.info',
                method: 'get_bank_citys_by_state',
                args:[{'bank_state_id':bank_state_id}]
            }).then(function(bank_city_ids){
                var select_bank_city_id = $('#supplier_info_bank_city');
                select_bank_city_id.html('')
                if(bank_city_ids && bank_city_ids.length > 0){
                    _.each(bank_city_ids, function (x) {
                        var opt = $('<option>').text(x.name)
                            .attr('value', x.id);
                            select_bank_city_id.append(opt);
                    });
                }else{
                    var opt = $('<option>').text('')
                        .attr('value', '');
                        select_bank_city_id.append(opt);
                }
            });
        })
    });
    // $(document).ready(function() {
    //     $('#supplier_info_bank_city').on('change',function(){
    //         var rpc = require('web.rpc');
    //         var bank_city_id = $("#supplier_info_bank_city").val();
    //         var blog_id = $("input[name='blog_post_id']").val();
    //         rpc.query({
    //             model: 'e2yun.supplier.info',
    //             method: 'get_bank_regions_by_city',
    //             args:[{'bank_city_id':bank_city_id}]
    //         }).then(function(bank_region_ids){
    //             var select_bank_region_id = $('#supplier_info_bank_region');
    //             select_bank_region_id.html('')
    //             if(bank_region_ids && bank_region_ids.length > 0){
    //                 _.each(bank_region_ids, function (x) {
    //                     var opt = $('<option>').text(x.name)
    //                         .attr('value', x.id);
    //                         select_bank_region_id.append(opt);
    //                 });
    //             }else{
    //                 var opt = $('<option>').text('')
    //                     .attr('value', '');
    //                     select_bank_region_id.append(opt);
    //             }
    //         });
    //     })
    // });
});