Передать переменную в шаблон

Учитывая этот шаблон:

<template id="minimal_layout_inherit" inherit_id="report.minimal_layout">
      <xpath expr="//head" position="inside">
             <link rel='stylesheet' href="my_module/static/src/css/mycss.css"/>
      </xpath>
</template>

Как я могу передать переменную с именем css_file из бэкэнда, чтобы шаблон можно было изменить на это:

<template id="minimal_layout_inherit" inherit_id="report.minimal_layout">
      <xpath expr="//head" position="inside">
             <link rel='stylesheet' t-att-href="css_file"/>
      </xpath>
</template>

Я попробовал парсер KabyR, адаптированный к моему случаю. Но переменная css_file не передается в унаследованный Minimum_layout: class ParticularReport(models.AbstractModel): _name = 'report.my_module.report_saleorder'

    @api.model
    def render_html(self, docids, data=None):
        report_obj = self.env['report']
        report = report_obj._get_report_from_name('my_module.report_saleorder')
        docs = self.env[report.model].browse(docids)
        docargs = {
            'doc_ids': docids,
            'doc_model': report.model,
            'docs': docs,
            'css_file': "/my_module/static/css/sale_report.css",
            'css_file2': "my_module/static/css/sale_report.css",
        }
        print '** DEBUG render_html docargs'
        print docargs
        for doc in docargs['docs']:
            print 'doc.id'
            print doc.id
        return report_obj.render('my_module.report_saleorder', docargs)

Учитывая, что у меня есть в моем пользовательском модуле:

<template id="report_saleorder">
    <t t-call="report.html_container">
        <t t-foreach="docs" t-as="doc">
            <t t-call="my_module.report_saleorder_document" t-lang="doc.partner_id.lang"/>
        </t>
    </t>
</template>

являющийся шаблоном report.html_container, который использует минимальный_шаблон (тот, который унаследован от того места, где нам нужна переменная).

Но css_file окончательно недоступен в унаследованном шаблоне

    <template id="report_saleorder_css" inherit_id="report.minimal_layout">
        <xpath expr="html/head/*[position() = last()]" position="after">
            <link rel="stylesheet" t-attf-href="my_module/static/css/sale_report.css"/>
            <link rel="stylesheet" t-att-href="css_file"/>
            <link t-att-href="'%s' % (css_file)" rel="stylesheet"/>
            <link t-att-href="'%s' % (css_file2)" rel="stylesheet"/>
            <span>AAA</span><span><t t-esc="css_file" /></span><span>BBB</span>
        </xpath>
    </template>

И вы получаете

2017-06-23 00:03:09,376 5131 INFO ? werkzeug: 127.0.0.1 - - [23/Jun/2017 00:03:09] "GET /my_module/static/css/sale_report.css HTTP/1.1" 200 -
2017-06-23 00:03:09,397 5131 INFO demo_v10 werkzeug: 127.0.0.1 - - [23/Jun/2017 00:03:09] "GET /None HTTP/1.1" 404 -
2017-06-23 00:03:09,963 5131 INFO demo_v10 werkzeug: 127.0.0.1 - - [23/Jun/2017 00:03:09] "GET /None HTTP/1.1" 404 -

Как видите, первый (жестко закодированный) работает, второй и третий (используют переменные css_file и css_file2) — нет. Также ничего не появляется между AAA и BBB в документе. Итак, css_file там нет.


person M.E.    schedule 18.06.2017    source источник


Ответы (1)


Попробуйте код ниже. parser.py

class ReportSaleOrderInherit(models.AbstractModel):

_name = 'report.sale.report_saleorder'
@api.model
def render_html(self, docids, data=None):
    report = self.env['report']._get_report_from_name('sale.report_saleorder')
    total = []
    model = report.model
    docs = self.env[model].browse(self.env.context.get('active_id'))
    docargs = {
        'doc_ids': self.ids,
        'doc_model': report.model,
        # 'data': data['form'],
        'docs': docs,
        'css_file':"/pos_general/static/src/css/report_css.css",
    }
    return self.env['report'].render('sale.report_saleorder', docargs)

template.xml

<template id="minimal_layout_inherit" inherit_id="report.minimal_layout">
  <xpath expr="//head" position="inside">
        <link t-att-href="'%s' % (css_file)" rel="stylesheet"/>
  </xpath>
</template>
person KbiR    schedule 19.06.2017
comment
@usk70, если ответ решил вашу проблему. пожалуйста, сделайте это как ответ. - person KbiR; 19.06.2017
comment
не работает, я думаю с шаблоном все в порядке, а с парсером нет. - person M.E.; 19.06.2017
comment
просто попробуйте напечатать css_file в своем шаблоне. например ‹t t-esc='css_file'/›. Проверить это распечатать или нет? - person KbiR; 19.06.2017
comment
С attf: 2017-06-19 13:30:10,553 11232 INFO demo_ps werkzeug: 127.0.0.1 - - [19/Jun/2017 13:30:10] GET /css_file HTTP/1.1 404 - - person M.E.; 19.06.2017
comment
просто распечатайте его в теле документа. забудьте о t-attf. - person KbiR; 19.06.2017
comment
Попробуйте так: ‹link rel='stylesheet' t-attf-href=my_module/static/src/css/mycss.css/› - person KbiR; 19.06.2017
comment
‹xpath expr=//head position=inside›‹span›XXXX‹/span›‹span›‹t t-esc=css_file/›‹/span›‹span›YYYY‹/span›‹/xpath› я вижу XXXX и YYYY, но ничего о значении переменной - person M.E.; 19.06.2017
comment
Пожалуйста, напишите ответ на мой последний комментарий. - person KbiR; 19.06.2017
comment
‹link rel='stylesheet' t-attf-href=my_module/static/src/css/mycss.css/› это работает, CSS загружен, и я вижу GET в журнале. Проблема с переменной - person M.E.; 19.06.2017
comment
Не работает, проблема в том, что там нет переменной. - person M.E.; 20.06.2017
comment
Приведенный выше код работал для отчета о заказе на продажу в моем пользовательском модуле. Пожалуйста, убедитесь, что ваш пользовательский анализатор работает, пожалуйста, напечатайте что-нибудь в нем. - person KbiR; 20.06.2017
comment
Это не работает, вы проверяли это в Odoo 10? Я получаю пустой PDF (без страниц). - person M.E.; 21.06.2017
comment
Просто добавьте оператор print в свой собственный парсер. И проверьте, печатает ли он на терминале или нет!. - person KbiR; 21.06.2017
comment
Ты получил ответ? - person KbiR; 22.06.2017
comment
Проверьте мой отредактированный пост, чтобы увидеть результаты парсера. В результате я получаю пустой (вообще без страниц) PDF-файл, и я предполагаю, что причина в том, что переменная docs не заполняется в пользовательском анализаторе. Кроме этого, переменная css_file правильно заполнена (но, очевидно, мне нужны все остальные обязательные поля для регулярного отображения документов sale_order). - person M.E.; 23.06.2017
comment
В вашем третьем отпечатке модель пуста. Пожалуйста, замените ваш модульmy_module на «продажа» и повторите попытку. - person KbiR; 23.06.2017
comment
Мне удалось найти проблему с парсером, и теперь он работает отлично (см. код выше), но... css_file недоступен в унаследованном шаблоне. - person M.E.; 23.06.2017
comment
обратите внимание, что я использую не стандартный sale.report_saleorder, а пользовательский в пользовательском модуле. - person M.E.; 23.06.2017
comment
Я понял это. Проверьте мой класс парсера, я написал в своем пользовательском модуле, но вызвал шаблон заказа на продажу по умолчанию. Так что я получил значение для model. И файл css вызывается из унаследованного шаблона. Попробуйте таким образом. Просто попробуйте вызвать отчет по умолчанию из вашего пользовательского парсера. - person KbiR; 23.06.2017
comment
Я изменил, как вы говорите, теперь я получаю шаблон заказа на продажу по умолчанию из своего модуля, парсер вызывается, но унаследованный шаблон minimal_layout по-прежнему не имеет доступа к переменной css_file. Я также безуспешно пытался создать парсер как для report.minimal_layout, так и для моего унаследованного шаблона для minimal_layout. Они не вызываются, я начинаю думать, что report.minimal_layout находится вне обычного потока шаблонов и для него нельзя закодировать парсер. - person M.E.; 23.06.2017