1:active字段为False的记录如何显示:
odoo中默认,active字段为False的记录上不显示的。但是如果在创建时没有勾选active,之后想要显示它,那就需要吧active修改为True。
然而它现在是不可见的,怎么修改?
通过odoo提供的搜索视图来实现:
自定义筛选——active字段——为假
即可把active为False的记录显示出来,点击它进行编辑,修改active为True即可。
2:添加了唯一性约束的字段,如何复制记录?
如果为模型的字段添加了唯一性约束,那么在记录的form视图功能菜单上选择“复制”时就会报错。
那么我们要在维持唯一性的前提下,保留复制功能,则只能重写模型的copy方法,在方法中为有唯一性约束的字段添加辨别性内容,使得纪录可以被成功复制(当然,新纪录中唯一性约束的字段时修改后的值,仍然唯一)
def copy(self, default=None): default = dict(default or {}) #统计数据库中已有多少个本纪录的副本 copied_count = self.search_count( [('字段', '=like', u"Copy of {}%".format(self.字段))]) #为副本中的字段值添加尾部修饰,维持唯一性 #第一次复制:cpoy of 原字段值 if not copied_count: new_字段 = u"Copy of {}".format(self.字段) #第n次复制:copy of 原字段值(次数) else: new_字段 = u"Copy of {} ({})".format(self.name, copied_count) #调用父类复制函数,并把新默认值传入 default['字段名'] = new_字段 return super(类名, self).copy(default)
3:想根据某字段不同值而进行不同显示,但有不需要显示该字段值,怎么办?
在视图标签中包含这个field(包含这个字段才可以使用该字段),但其invisible属性设置为1,即:该字段不可见。
<field name="字段" invisible="1"/>
4:逆运算
当通过compute属性指定方法,根据依赖值计算得到当前字段值时。一般也要制定这个计算的逆运算——根据当前字段值,改变依赖值。
比如:开始日期+持续时间=结束日期,我们有这个可以得到结束日期。
如果用户指定了开始日期和结束日期,那么持续时间=介绍日期-开始日期,实现这个逻辑的方法就是inverse属性值指向的方法。
#定义结束日期字段,结束日期由开始+持续,而设置结束日期,则需要自行计算出持续日期 end_date = fields.Date(string="End Date", store=True, compute='_get_end_date', inverse='_set_end_date') #"获取结束日期"事件的响应函数:计算出结束日期 @api.depends('start_date', 'duration') def _get_end_date(self): for r in self: if not (r.start_date and r.duration): r.end_date = r.start_date continue start = fields.Datetime.from_string(r.start_date) duration = timedelta(days=r.duration, seconds=-1) r.end_date = start + duration #"设置结束日期"事件的响应函数:计算并设置持续时间 def _set_end_date(self): for r in self: if not (r.start_date and r.end_date): continue start_date = fields.Datetime.from_string(r.start_date) end_date = fields.Datetime.from_string(r.end_date) r.duration = (end_date - start_date).days + 1
5:odoo图片显示
odoo没有专门的图片标签,但是可以通过widget来控制field标签来显示图片内容。
图片的内容保存在Binary类型的字段中,然后在视图文件中通过以下语句显示出来:
<field name="Img字段" widget="image" class="oe_avatar oe_left"/>
6:Odoo中数据保存的流程
在新建一条记录,点击“保存”按钮后,会把该条记录保存到数据库中。
有时候,我们会对模型记录进行约束,比如:与其他记录比较某字段值,不能相同或者范围重叠等。
此时,会遇到一个问题:新增记录会与自己进行比较。
很多人对约束的理解为:新建一条记录,点击“保存”时进行约束检查,如果不符合要求则抛出异常,记录生成失败。
然而,真正的流程应该是:内存中生成了模型记录——尝试插入表——约束检查——检测到异常,插入失败。
约束,是在记录生成之后,插入数据表之前进行的判断,约束不能阻止记录的生成。我们可以在代码中,通过环境上下文访问到新生成的记录!
因此,如果在约束函数中将新记录与数据库中查找记录进行比较时,切记要增加一个判断条件:新记录id!=数据库中记录id,避免自己与自己比较。