为 many2one 字段设置默认值

set default value for a many2one field

当用户设置nom_rubrique时,many2one填充的值会默认设置

 class A(models.Model):

    rubrique_id = fields.Many2one('risques.rubrique',
        string='Rubrique',
        default=_default_rubrique,
        index=True,
        track_visibility='onchange',
        change_default=True)

class B(models.Model):
    critere_ids = fields.One2many('risques.critere','rubrique_id',required=True, string="Critére d'évaluation")

您的代码似乎有语法错误,请尝试以下解决方案:

另外 parent_id 字段在您的参考 risques.rubrique 模型中不存在

class critere(models.Model):
    _name = 'risques.critere'
    _rec_name = 'nom_critere'

    def _default_rubrique(self):
        #here you did mistake , your search method syntex was wrong
        #also it is better to use limit instead of [0] it may raise 
        #error if your search will return empty list
        return self.env['risques.rubrique'].search([('parent_id', '=', False)], limit=1).id

    nom_critere = fields.Char(string="Nom du Critere")
    rubrique_id = fields.Many2one('risques.rubrique',
                                  string='Rubrique',
                                  default=_default_rubrique,
                                  index=True,
                                  track_visibility='onchange',
                                  change_default=True)

class rubrique(models.Model):
    _name = 'risques.rubrique'
    _rec_name = 'nom_rubrique'
    nom_rubrique = fields.Char(string="Rubrique")
    critere_ids = fields.One2many('risques.critere', 'rubrique_id', required=True, string="Critére d'évaluation")

除了在 xml 表单或树的上下文中使用此:

 <field field="id" invisible="1"/>
 <field name="critere_ids" context="{'default_rubrique_id': id}" />

但这仅在记录已创建并且您正在尝试修改它时有效。 您会看到 m2o 字段字段将具有与您所在的相同记录。

但是当您处于创建模式时,此时不会创建记录,因此永远无法将其作为默认值传递,并且无论您做什么,many2one 都将保持为空。

但即使是用户 select 另一条记录,当用户保存父记录时,您也会看到 selected 值已更改为父值。 我的意思是不管用户 select 在那个 m2o 字段上的值将被忽略并替换为父 ID。

所以最好的办法是为你的 one2many 字段定义一个嵌入的树和表单:

<field name="critere_ids">
     <tree>
         <!-- list of field without rubrique_id field -->
     </tree>
     <form>
        <!-- new form structor  without rubrique_id field -->
     </form>
</field>

因为在 one2many 字段中,用户根本不需要看到 many2one,他知道该记录属于父级,所以可以看到它,或者 select 根本看不到它。

使用 lambda 设置默认值:

type = fields.Many2one('your.model',"String to display", default=lambda self: self.env['your.model'].search([('name','=','value you need to set as default')]))

很简单。

的答案几乎是正确的。由于我无法编辑他的答案,我将在这里编辑他的答案

type = fields.Many2one('your.model',"String to display", 
                        default=lambda self: 
                        self.env['your.model']
                       .search([], limit=1))

我们不需要提供一些搜索表达式和我们需要限制结果的重要内容,否则我们会得到一个错误