Если вы посмотрите на мой предыдущий ответ, вы увидите, как вы определяете собственный отчет для своей модели. Важная часть состоит в том, что вы находите объект отчета и вызываете метод визуализации на нем. Следующая важная часть - передать аргументы, которые вы хотите передать.
Как только вы это сделаете, вы можете получить доступ к этим значениям по имени ключа в отчете qweb. Я понимаю, что существует много концепций и контекстов и бла-бла-бла, чтобы переварить нового разработчика Odoo. Я попытаюсь привести пример. И сделайте все возможное, чтобы оно было максимально простым. Если это заставляет вас чувствовать себя лучше, я провел большую часть дня в первый раз, когда я попытался сделать это с помощью специального отчета.
Вам необходимо будет определить класс AbstractModel для вашего отчета. Включите это файл .py
, который включен в __init__.py
. Вероятно, вам понадобится некоторое ведение журнала, чтобы увидеть, что происходит, если вам не повезло, что он работает в первый раз.
Я не был.
import logging
_logger = logging.getLogger(__name__)
class YourReport(models.AbstractModel):
_name = 'report.your_addon.report_template_id'
@api.multi
def render_html(self, data=None):
_logger.info("RUNNING REPORT")
report_obj = self.env['report']
report = report_obj._get_report_from_name('your_addon.report_template_id')
docs = self.env['your_addon.your_model'].search([('something','=','something')])
docargs = {
'doc_model': report.model,
'docs': docs,
}
return report_obj.render('your_addon.report_template_id', docargs)
В классе выше мы переопределяем метод render_html
. Метод модели отчета _get_report_from_name
- это всего лишь метод, который возвращает объект отчета для именованного отчета. Вы можете заменить его любым odoo orm
, который возвращает объект просмотра для отчета.
Затем вы должны создать определение xml для своего отчета.
<openerp>
<data>
<report
id="report_template_id"
model="your_addon.model"
string="Report Title"
name="your_addon.report_template_view"
file="your_addon.report_template"
report_type="qweb-pdf"/>
<template id="report_template_view">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t>
<div class="page">
<t t-esc="doc.field_name"/>
</div>
</t>
</t>
</t>
</template>
</data>
</openerp>
При создании кнопки в представлении формы любой модели, которая выполняет метод возвращающегося действие отчета функция render_html для отчета будет называться.
@api.multi
def print_report(self):
return {
'type' : 'ir.actions.report',
'report_name': 'report_template_id'
'datas': {
'ids': [ self.id ],
'model': 'your_addon.your_model'
}
}
Взгляните на мой существующий ответ. У него может быть необходимая информация. http://stackoverflow.com/questions/40290627/custom-report-through-python-odoo-9/40291820#40291820 –
@PhillipStack Спасибо за повтор. В вашем примере я не вижу вида (с полем) и как вызывается render_html –
Когда вы правильно зарегистрировали свой отчет, Odoo вызовет этот метод для вас. Вы просто пытаетесь назвать свой отчет, используя более раскрывающееся меню? Я сейчас расширяю для вас ответ. Дайте мне минуту. –