为 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))
我们不需要提供一些搜索表达式和我们需要限制结果的重要内容,否则我们会得到一个错误
当用户设置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))
我们不需要提供一些搜索表达式和我们需要限制结果的重要内容,否则我们会得到一个错误