Я попробовал это, и это сработало, надеюсь, вы поняли идею.Во-первых, есть некоторый факт, который я знаю (но не уверен), что заставило меня прийти с этой логикой.
- Нет прямого способа установить атрибут на
docs
или o
(RecordSetпередано в отчет) на Qweb. - У нас есть доступ к контексту
o.env.context
. - , когда вы вызываете шаблон внутри другого, последний имеет доступ к области видимости первого шаблона.
Вместо добавления атрибута, почему мы не просто добавляем ключ в контекст магического атрибута, используя o.with_context
, используя силу t-set
, мы можем добавить дополнительный key
, но нам нужно сделатьубедитесь, что мы делаем это прежде, чем мы вызовем <t t-call="report.external_layout">
в шаблоне отчета, чтобы external_layout
смог найти этот дополнительный key
в контексте ^^
<!-- add extra key to context -->
<!-- you can set it one time on docs it's better -->
<t t-set="o" t-value="o.with_context(report_name='hello_report')"/>
<t t-call="report.external_layout">
Теперь, потому что контекст - это экземпляр frozendict или что-то подобное(Я не уверен), мы можем использовать get
со значением по умолчанию, чтобы проверить, передается ли этот специальный ключ в контексте.
<template id="external_layout_header" inherit_id="report.external_layout_header">
...
<t t-if="o.env.context.get('report_name', False) == 'hello_report'">
<!-- show what you want to show for this report -->
Или вы можете сделать его еще лучше, сделав это поведение общимпросто передав само значение в соТаким образом, это сведет к минимуму число if statements
для вас external_layout.
<template id="external_layout_header" inherit_id="report.external_layout_header">
...
<t t-if="o.env.context.get('extra_value', False)">
<p t-esc="o.env.context.get('extra_value')"></p>
Таким образом, для любого отчета, который вам нужен, чтобы иметь такое поведение.если он существует, наследуйте шаблон и убедитесь, что вы добавили ключ перед вызовом external_layout
, используя x-path
.
. Правки:
пример результатаэто в odoo 8.0
Я не использовал наследование, я непосредственно обновил remplates.
sale.order template
<template id="report_saleorder_document">
<t t-set="o" t-value="o.with_context(extra_info='show this on header')"/>
<t t-call="report.external_layout">
внешний макет отчета
<template id="external_layout_header">
<div class="header">
<div class="row">
<t t-if=" 'extra_info' in o.env.context" >
<p t-esc="o.env.context.get('extra_info')"></p>
</t>
<div class="col-xs-3">
<img t-if="company.logo" t-att-src="'data:image/png;base64,%s' % company.logo" style="max-height: 45px;"/>
</div>
<div class="col-xs-9 text-right" style="margin-top:20px;" t-field="company.rml_header1"/>
</div>
....
.....
...
результат таков