【问题标题】:how can I once I select a field the other fields have values?一旦我选择了一个字段,我如何才能让其他字段有值?
【发布时间】:2017-07-31 10:31:44
【问题描述】:

我想要的是,一旦我选择了第一个字段,与此选择相关的字段就会有它们的值

    nameTest = fields.Many2one(
        comodel_name='medical.lab.patient',
        required=True,
    )

nameTest 是一个对象,如何访问与该对象相关的字段?

【问题讨论】:

    标签: openerp odoo-10


    【解决方案1】:

    这里有 2 个选项(在我的示例中,我已将 nameTest 更改为 my_many2one_id!):

    1. 使用 onchange 行为
    class MyModel(models.Model):
        _name = 'my.model'
    
        my_many2one_id = fields.Many2one(
            comodel_name='medical.lab.patient',
            required=True
        )
        my_field1 = fields.Boolean(string="My Field1")
        my_field2 = fields.Char(string="My Field2")
    
        @api.onchange('my_many2one_id')
        def onchange_my_many2one_id(self):
            self.my_field1 = self.my_many2one_id.my_field1
            self.my_field2 = self.my_many2one_id.my_field2
    
    1. 使用相关字段
        my_field3 = fields.Boolean(
            string="My Field3", related="my_many2one_id.my_other_field3")
        my_field4 = fields.Char(
            string="My Field4", related="my_many2one_id.my_other_field4")
    

    【讨论】:

      【解决方案2】:

      你需要的是相关领域:

      假设有model.one

       _name = 'model.one'
      
       field_1 = fields.Char(..)
       field_2 = fields.Date(..)
      

      和模型model.two 具有one2many 字段到model.one

      _name = 'model.two'
      
       many2one_field = fields.Many2one(co_model='model.one', ....)
       # just add related field two use them in the view.
       # here I chosed to give them the same name 
       # if you don't specify any attribute like string , required ....
       # they inherit the attributes of the model.one fields
       field_1 = fields.Char(related='many2one_field.field_1',
                              readonly=True)
       field_2 = fields.Date(related='many2one_field.field_2',
                              readonly=True)
      

      当您选择 many2one 字段时,相关字段就像代理或计算字段一样工作 那里的价值会自动改变。

      如果您只想用相关字段的值填充该字段 创建 onchange 事件

         @api.onchange('many2one_field')
         def onchange_many2OneField(self):
              # first check many2one field have value
              if self.many2one_field:
                  self.field_1 = self.many2one_field.some_field_1
                  self.field_2 = self.many2one_field.some_field_2
              else:
                  # make them all False if it what you want
                  self.field_1 = False
                  self.field_2 = False
      

      【讨论】:

      • 如果'model.one' field_1 = fields.Many2One(..) and field_2 = fields.Many2One(..)
      • 我给你一个两个模型的例子来理解这个想法不需要编写不需要的代码 field_1 = fields.Char(string='Label for field')
      • model.one 上已经相关的字段怎么样 cat = fields.Float(related='test_type_cat.name',)
      • 你可以把相关转到那个模型'many2one_field.test_type_cat.name'只要记住在这里保持相同的类型Float。
      • 您也必须在相关字段上定义相同的选择
      【解决方案3】:

      使用

      @api.onchange(put_your_fields_here)
      def onchange_custom(self):
      
      return {'value': {'field_1': value1, 'field_2': value_2)}
      

      【讨论】:

      • 但是如何获取与第一个字段相关的值?
      • self.first_field
      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      相关资源
      最近更新 更多