在本篇博客中,我们将讨论如何在Odoo的明细行中的表单视图打开时自动预览附件。这是一个非常实用的功能,尤其是当用户需要快速查看与记录相关的文档或图片时。我们将通过一个计算字段来实现这一功能,该字段将存储用于显示附件的iframe的HTML代码。
实现效果
首先,我们需要在我们的模型中定义一个计算字段tracking_iframe
,该字段的类型为Html
。这个字段不会被清洗(sanitize=False
),以确保我们可以插入iframe标签。我们将使用compute
参数指定一个方法get_html
来计算这个字段的值。
from odoo import models, fields, api
class YourModel(models.Model):
_name = 'your.model'
_description = 'Your Model Description'
# 计算字段,用于存储iframe的URL
tracking_iframe = fields.Html("Tracking Preview", sanitize=False, compute='get_html')
@api.depends('invoice_image') # 假设 'invoice_image' 是触发附件预览更新的字段
def get_html(self):
for record in self:
# 查询附件
attachment = self.env['ir.attachment'].search([
('res_model', '=', record._name),
('res_id', '=', record.id),
('res_field', '=', 'invoice_image') # 根据实际字段名更改
], limit=1)
if attachment:
# 构造PDF.js预览URL
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
src = f"{base_url}/web/static/lib/pdfjs/web/viewer.html?file=/web/content/{}?model%3Dir.attachment#pagemode=none"
# 生成iframe HTML
record.tracking_iframe = f'<iframe class="attachment_preview_iframe" width="900px" height="600px" frameborder="0" src="{src}"></iframe>'
else:
record.tracking_iframe = False
在上述代码中,get_html
方法会遍历当前模型的每条记录,搜索与该记录相关联的附件。如果找到附件,我们将使用Odoo内置的PDF.js库来构造一个预览URL,并将其嵌入到一个iframe中。然后,我们将这个iframe的HTML代码赋值给tracking_iframe
字段。
接下来,我们需要在表单视图中添加这个字段,以便用户可以看到附件的预览。
<odoo>
<data>
<record id="view_form_your_model" model="ir.ui.view">
<field name="name">your.model.form</field>
<field name="model">your.model</field>
<field name="arch" type="xml">
<form string="Your Model">
<!-- 其他字段 -->
<field name="tracking_iframe" widget="html" nolabel="1" />
</form>
</field>
</record>
</data>
</odoo>
在表单视图的XML定义中,我们添加了tracking_iframe
字段,并指定了widget="html"
以确保HTML内容能够正确显示。nolabel="1"
属性用于隐藏字段的标签。
这样,当用户打开明细行的表单视图时,如果存在相关的附件,它将自动显示在预览iframe中。这为用户提供了一种快速方便的方式来查看和验证附件内容,无需离开当前视图或进行额外的点击操作。