如何从方法中打印循环数据

how to print looped data from a method

我创建了一个方法如下:但它只需要最后一个循环数据而不是所有数据到 xml 来生成 pdf,所以需要一种方法来从这个方法循环生成 pdf

def bsku_asin_picking(self):
    website = self.env['website'].search([('company_id', '=', self.env.company.id)], limit=1)
    # print('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', website.label_type)
    # vals = []
    for rec in self.move_ids_without_package:
        product = self.env['product.product'].browse(rec.product_id.id)
        data = {
            'quantity': rec.product_uom_qty,
            'display_name': product.display_name,
            'product': product,
        }

        if website.label_type == 'bsku':
            data['barcode_value'] = product.bsku
        else:
            data['barcode_value'] = product.asin
        # vals.append(data)
    return self.env.ref('product_label_bsku_sin.report_product_template_label').report_action(product, data=data)

通过 data 传递的变量将在渲染上下文中可用。

示例:

def bsku_asin_picking(self):

    website = self.env['website'].search([('company_id', '=', self.env.company.id)], limit=1)

    vals = []

    for rec in self.move_ids_without_package:
        product = rec.product_id
        product_data = {
            'quantity': rec.product_uom_qty,
            'display_name': product.display_name,
            'product': product,
        }
        if website.label_type == 'bsku':
            product_data['barcode_value'] = product.bsku
        else:
            product_data['barcode_value'] = product.asin
        vals.append(product_data)

    datas = {'vals': vals}

    return self.env.ref('product_label_bsku_sin.action_report_product_template_label').report_action(self, data=datas)

然后你可以循环 vals 并打印产品数据。

示例:

<t t-foreach="vals" t-as="product_data">
    <p t-out="product_data['quantity']"/>
    <p t-out="product_data['display_name']"/>
    <p t-out="product_data['product']"/>
    <p t-out="product_data['barcode_value']"/>
</t>

备选

你也可以在没有 data 的情况下调用 report_action 并循环遍历 move_ids_without_package:

示例:

<t t-set="website_label_type" t-value="doc.env['website'].search([('company_id', '=', doc.env.company.id)], limit=1)"/>

<t t-foreach="doc.move_ids_without_package" t-as="line">
    <p t-out="line.product_uom_qty"/>
    <p t-out="line.display_name"/>
    <p t-out="line.product_id.name"/>
    
    <t t-if="website_label_type == 'bsku'">
        <span t-out="line.product_id.bsku"/>
    </t>
    <t t-else="">
        <span t-out="line.product_id.asin"/>
    </t>
</t>