想要导出产品,由于自定义的导出在导出一些关联字段时,导出的是id而不是想要的name参数,所以只能手动写一个导出功能。
流程
添加一个导出的 act_window 到产品表,该 act_window 对应一个导出记录表的form视图,form视图定义了一个button,button点击生成一个excel并新开一个文件下载地址的url窗口。
创建导出记录表
由于导出按钮是跳转到对应的一个form视图,需要有一个导出文件的二进制字段提供下载,所以创建一个导出的model
from odoo import fields, models, api
import base64
import xlwt
from io import BytesIO
class ExportWizard(models.Model):
_name = 'export.wizard'
file = fields.Binary('導出文件')
def generate_excel(self, product_ids):
"""
根据产品数据导出excel
:param product_ids: product.template()
:return:
"""
workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('產品清單')
# add header
header = ['編號', '名稱', '單價', '單位']
for col in range(len(header)):
worksheet.write(0, col, header[col])
# add data
for row in range(1, len(product_ids)+1):
product_id = product_ids[row-1]
worksheet.write(row, 0, product_id.id)
worksheet.write(row, 1, product_id.name)
worksheet.write(row, 2, product_id.list_price)
worksheet.write(row, 3, product_id.uom_id.name)
# save
buffer = BytesIO()
workbook.save(buffer)
return base64.encodebytes(buffer.getvalue())
@api.multi
def action_export(self):
context = dict(self._context or {})
active_ids = context.get('active_ids', []) or []
product_tmpl_ids = self.env['product.template'].search([('id', 'in', active_ids)])
self.file = self.generate_excel(product_tmpl_ids)
value = dict(
type='ir.actions.act_url',
target='new',
url='/web/content?model=%s&id=%s&field=file&download=true&filename=product.xls' % (self._name, self.id),
)
return value
创建导出记录表的视图
<record id="wizard_view" model="ir.ui.view">
<field name="name">export wizard</field>
<field name="model">export.wizard</field>
<field name="arch" type="xml">
<form string="導出記錄">
<footer>
<button string="下載" class="btn-primary" name="action_export" type="object"/>
<button string="關閉" class="btn-default" special="cancel" />
</footer>
</form>
</field>
</record>

添加导出按钮到目标表的action(动作)下拉列表中

<act_window id="export_wizard_action"
name="導出Excel"
src_model="product.template"
res_model="export.wizard"
view_type="form" view_mode="form"
target="new"/>
其中,
src_model表示在哪个 model 上添加这个act_window- res_model 表示这个
act_window将会跳转到哪一个 model - view_type res_model 显示的视图类型
- view_mode res_model 显示的视图种类列表
- target 视图在当前视图(
src_model) 上的打开方式。- 在当前视图上打开(current)
- 使用全屏模式(fullscreen)
- 使用弹出框(new)
- 用main代替current来清除面包屑导航
个人博客 原文地址