Шаблони QWeb

QWeb є основною системою templating, яку використовує Odoo2. Це система шаблонів XML1, яка використовується переважно для генерування HTML фрагментів і сторінок.

Директиви шаблону вказуються як XML-атрибути з префіксом t-, наприклад t-if для Умовні, з елементами та іншими атрибутами, які відображаються безпосередньо.

Щоб уникнути візуалізації елемента, також доступний елемент-заповнювач <t>, який виконує свою директиву, але не генерує жодного виводу сам по собі:

<t t-if="condition">
    <p>Test</p>
</t>

призведе до:

<p>Test</p>

якщо condition true, але:

<div t-if="condition">
    <p>Test</p>
</div>

призведе до:

<div>
    <p>Test</p>
</div>

Виведення даних

Вихідна директива QWeb out автоматично екрануватиме вхідні дані за допомогою HTML, обмежуючи ризики XSS під час відображення користувацького контенту.

out приймає вираз, обчислює його та вставляє результат у документ:

<p><t t-out="value"/></p>

відтворено зі значенням value встановленим на 42 дає:

<p>42</p>

Див. Розширений вивід для більш складних тем (наприклад, введення необробленого HTML тощо).

Умовні

QWeb має умовну директиву if, яка обчислює вираз, поданий як значення атрибута:

<div>
    <t t-if="condition">
        <p>ok</p>
    </t>
</div>

Елемент відображається, якщо умова - true:

<div>
    <p>ok</p>
</div>

але якщо умова - false, вона видаляється з результату:

<div>
</div>

Умовне відображення застосовується до носія директиви, яка не обов’язково має бути <t>:

<div>
    <p t-if="condition">ok</p>
</div>

дасть ті самі результати, що й попередній приклад.

Також доступні додаткові директиви умовного розгалуження t-elif і t-else:

<div>
    <p t-if="user.birthday == today()">Happy birthday!</p>
    <p t-elif="user.login == 'root'">Welcome master!</p>
    <p t-else="">Welcome!</p>
</div>

Повторення

QWeb має директиву ітерації foreach, яка приймає вираз, що повертає колекцію для ітерації, і другий параметр t-as, що надає назву для використання для «поточного елемента» ітерації:

<t t-foreach="[1, 2, 3]" t-as="i">
    <p><t t-out="i"/></p>
</t>

буде представлено як:

<p>1</p>
<p>2</p>
<p>3</p>

Як і умови, foreach застосовується до елемента, що несе атрибут директиви, і

<p t-foreach="[1, 2, 3]" t-as="i">
    <t t-out="i"/>
</p>

еквівалентний попередньому прикладу.

foreach може повторювати масив (поточний елемент буде поточним значенням) або відображення (поточний елемент буде поточним ключем). Ітерація цілого числа (еквівалентна ітерації масиву від 0 включно до наданого виняткового цілого числа) все ще підтримується, але не підтримується.

На додаток до імені, переданого через t-as, foreach надає кілька інших змінних для різних точок даних:

Попередження

$as буде замінено іменем, переданим t-as

$as_all (застаріле)

об’єкт, який повторюється

Примітка

Ця змінна доступна лише на JavaScript QWeb, а не на Python.

$as_value

поточне значення ітерації, ідентичне $as для списків і цілих чисел, але для відображень воно надає значення (де $as надає ключ)

$as_index

індекс поточної ітерації (перший елемент ітерації має індекс 0)

$as_size

розмір колекції, якщо вона доступна

$as_first

чи є поточний елемент першим у ітерації (еквівалентно $as_index == 0)

$as_last

чи є поточний елемент останнім у ітерації (еквівалентно $as_index + 1 == $as_size), вимагає наявності розміру ітерованого

$as_parity (застаріле)

або "even" або "odd", парність поточного циклу ітерації

$as_even (застаріле)

логічний прапор, який вказує, що поточний раунд ітерації має парний індекс

$as_odd (застаріле)

логічний прапор, який вказує, що поточний раунд ітерації має парний індекс

Ці надані додаткові змінні та всі нові змінні, створені в foreach, доступні лише в області foreach. Якщо змінна існує поза контекстом foreach, значення копіюється в кінці foreach у глобальний контекст.

<t t-set="existing_variable" t-value="False"/>
<!-- existing_variable now False -->

<p t-foreach="[1, 2, 3]" t-as="i">
    <t t-set="existing_variable" t-value="True"/>
    <t t-set="new_variable" t-value="True"/>
    <!-- existing_variable and new_variable now True -->
</p>

<!-- existing_variable always True -->
<!-- new_variable undefined -->

Атрибути

QWeb може обчислювати атрибути на льоту та встановлювати результат обчислення на вихідному вузлі. Це робиться за допомогою директиви t-att (атрибут), яка існує в 3 різних формах:

t-att-$name

створюється атрибут під назвою $name, значення атрибута оцінюється, а результат встановлюється як значення атрибута:

<div t-att-a="42"/>

буде представлено як:

<div a="42"></div>
t-attf-$name

те саме, що й попередній, але параметр є format string, а не просто виразом, часто корисним для змішування літерального та нелітерального рядків (наприклад, класів):

<t t-foreach="[1, 2, 3]" t-as="item">
    <li t-attf-class="row {{ (item_index % 2 === 0) ? 'even' : 'odd' }}">
        <t t-out="item"/>
    </li>
</t>

буде представлено як:

<li class="row even">1</li>
<li class="row odd">2</li>
<li class="row even">3</li>

Порада

Існує два еквівалентні синтаксиси для рядків форматування: "plain_text {{code}}" (також відомий як jinja-style) та "plain_text #{code}" (також відомий як ruby-style).

t-att=mapping

якщо параметр є відображенням, кожна пара (ключ, значення) генерує новий атрибут і його значення:

<div t-att="{'a': 1, 'b': 2}"/>

буде представлено як:

<div a="1" b="2"></div>
t-att=pair

якщо параметр є парою (кортежем або масивом із 2 елементів), перший елемент пари - назва атрибута, а другий - значення:

<div t-att="['a', 'b']"/>

буде представлено як:

<div a="b"></div>

Налаштування змінних

QWeb дозволяє створювати змінні з шаблону, запам’ятовувати обчислення (використовувати його кілька разів), давати фрагменту даних чіткішу назву, …

Це робиться за допомогою директиви set, яка приймає назву змінної для створення. Значення для встановлення можна надати двома способами:

  • атрибут t-value, що містить вираз, і результат його оцінки буде встановлено:

    <t t-set="foo" t-value="2 + 1"/>
    <t t-out="foo"/>
    

    надрукує 3

  • якщо атрибут t-value відсутній, тіло вузла відображається та встановлюється як значення змінної:

    <t t-set="foo">
        <li>ok</li>
    </t>
    <t t-out="foo"/>
    

Виклик підшаблонів

Шаблони QWeb можна використовувати для візуалізації верхнього рівня, але їх також можна використовувати з іншого шаблону (щоб уникнути дублювання або надати імена частинам шаблонів) за допомогою директиви t-call:

<t t-call="other-template"/>

Це викликає названий шаблон із контекстом виконання батьківського, якщо other_template визначено як:

<p><t t-value="var"/></p>

виклик вище буде відображено як <p/> (без вмісту), але:

<t t-set="var" t-value="1"/>
<t t-call="other-template"/>

буде відображено як <p>1</p>.

Однак, це має проблему видимості ззовні t-call. Як варіант, вміст, встановлений у тілі директиви call, буде оцінено перед викликом підшаблону та може змінити локальний контекст:

<t t-call="other-template">
    <t t-set="var" t-value="1"/>
</t>
<!-- "var" does not exist here -->

Тіло директиви call може бути як завгодно складним (не тільки директиви set), і її відтворена форма буде доступна в шаблоні виклику як магічна змінна 0:

<div>
    This template was called with content:
    <t t-out="0"/>
</div>

називається так:

<t t-call="other-template">
    <em>content</em>
</t>

призведе до:

<div>
    This template was called with content:
    <em>content</em>
</div>

Розширений вивід

За замовчуванням, out має екранувати HTML-контент, який потрібно екранувати, захищаючи систему від XSS.

Контент, який не потребує екранування, буде вставлено в документ як є та може стати частиною фактичної розмітки документа.

Єдиний кросплатформний «безпечний» контент - це вивід t-call або t-set, що використовується з «body» (на відміну від t-value або t-valuef).

Python

Зазвичай вам не варто надто перейматися: API, для яких це має сенс, повинні автоматично генерувати «безпечний» контент, і все має працювати прозоро.

Для випадків, коли потрібно зробити речі зрозумілішими, наступні API виводять безпечний контент, який за замовчуванням не буде (повторно) екрановано під час вставки в шаблони:

  • HTML-поля.

  • html_escape() та markupsafe.escape() (це псевдоніми, і вони не мають ризику подвійного екранування).

  • html_sanitize().

  • markupsafe.Markup.

    Попередження

    markupsafe.Markup - це небезпечний API, це твердження про те, що ви хочете, щоб контент був безпечним для розмітки, але не обов’язково можете це перевірити, його слід використовувати обережно.

  • to_text() не позначає контент як безпечний, але й не видаляє цю інформацію з безпечного контенту.

примусове подвійне екранування

Якщо контент позначено як безпечний, але з якоїсь причини його все одно потрібно екранувати (наприклад, для виведення розмітки полів HTML), його можна просто перетворити назад у звичайний рядок, щоб «зняти» прапорець безпеки, наприклад, str(content) у Python та String(content) у Javascript.

Примітка

Оскільки Markup є набагато багатшим типом, ніж Markup(), деякі операції видалятимуть інформацію про безпеку з Markup(), але не з Markup, наприклад, конкатенація рядків ('' + content) у Python призведе до Markup з належним чином екранованим інший операнд, тоді як у Javascript поверне String(), де інший операнд не був екранований перед конкатенацією.

Застарілі вихідні директиви

esc

Псевдонім для out спочатку використовувався для екранування вводу за допомогою HTML. Поки що офіційно не застарів, оскільки єдина відмінність між out та esc полягає в тому, що останнє дещо незрозуміле/неправильне.

raw

Версія методу out, яка ніколи не виводить свій вміст. Контент виводиться як є, незалежно від того, безпечний він чи ні.

Застаріло починаючи з версії 15.0: Використовуйте замість цього out зі значенням markupsafe.Markup.

t-raw було застарілим, оскільки в міру розвитку коду, який створює контент, може бути важко відстежити, чи буде він використаний для розмітки, що призводить до складніших оглядів та небезпечніших помилок.

Python

Ексклюзивні директиви

Пакети активів

Форматування полів «розумних записів»

Директиву t-field можна використовувати лише під час виконання доступу до поля (a.b) для «розумного» запису (результат методу browse). Він здатний автоматично форматувати на основі типу поля та інтегрований у редагування форматованого тексту веб-сайту.

t-options можна використовувати для налаштування полів, найпоширенішим варіантом є widget, інші параметри залежать від полів або віджетів.

Налагодження

t-debug

з порожнім значенням викликає вбудовану функцію breakpoint(), яка зазвичай викликає налагоджувач (за замовчуванням pdb).

Поведінку можна налаштувати за допомогою PYTHONBREAKPOINT або sys.breakpointhook().

Кеш рендерингу:

t-cache="key_cache" позначає частину шаблону, яка буде кешована під час рендерингу. Кожна піддиректива буде викликана лише під час першого рендерингу. Це означає, що SQL-запити, що виконуються під час рендерингу цих піддиректив, також виконуються лише один раз.

t-nocache="documentation" позначає частину шаблону, яка відображатиметься щоразу. Контент може використовувати лише кореневі значення.

Чому і коли використовувати t-cache?

Ця директива використовується для пришвидшення рендерингу шляхом кешування частин кінцевого документа, що може заощадити запити до бази даних. Однак її слід використовувати економно, оскільки t-cache неминуче ускладнить шаблони (і їхнє розуміння t-set, наприклад).

Однак, щоб фактично зберегти запити до бази даних, може знадобитися відобразити шаблон зі значеннями, які обчислюються ліниво. Якщо ці ліниві значення використовуються в кешованій частині, вони не будуть обчислюватися, якщо ця частина доступна в кеші.

Директива t-cache корисна для частин шаблону, що використовують значення, що залежать від обмеженої кількості даних. Ми рекомендуємо аналізувати рендеринг шаблону за допомогою профайлера (активувавши опцію «Додати контекст директиви qweb»). Передача відкладених значень під час рендерингу в контролерах дозволяє відображати директиви, використовуючи ці значення, та запускати запити.

Проблема використання такого кешу полягає в тому, щоб зробити його доступним для різних користувачів (різні користувачі повинні відображати кешовані частини однаково). Ще однією потенційною проблемою є анулювання його записів за необхідності. Для останнього ключовий вираз слід вибирати з розумом. Використання write_date набору записів може зробити ключ кешу застарілим, наприклад, без необхідності явного видалення його з кешу.

Також слід звернути увагу на те, що значення в частинах t-cache мають область видимості. Це означає, що якщо в цій частині шаблону є директиви t-set, відображення того, що йде після неї, може відрізнятися від того, якби директиви t-cache не було.

Що робити, якщо всередині t-cache є t-cache?

Частини кешуються. Кожна містить лише рядок, що відповідає її рендерингу. Таким чином, t-cache всередині, ймовірно, буде зчитуватися рідше, його ключ кешу не обов’язково буде використовуватися. Якщо це має бути так, то вам може знадобитися додати t-nocache (на тому ж вузлі або батьківському).

Для чого використовується t-nocache?

Якщо ви хочете кешувати частину шаблону за допомогою t-cache, але невеликий фрагмент має залишатися динамічним та оцінюватися під час кешування. Однак частина в t-nocache не матиме доступу до значення t-set шаблону. Там доступні лише значення, надані контролером. Наприклад, меню кешується, оскільки воно завжди одне й те саме та потребує часу для рендерингу (використання інструментів розробника продуктивності з контекстом qweb дозволяє дослідити це). Однак у меню ми хочемо, щоб кошик електронної комерції завжди був актуальним. Тому існує t-nocache, щоб ця частина залишалася динамічною.

Основа t-cache

Директива t-cache дозволяє зберігати результат відображення шаблону. Ключовий вираз (наприклад, 42: t-cache="42") буде обчислено як вираз Python. Це буде використано для генерації ключа кешу. Таким чином, можуть бути різні значення кешу (кешована частина відображення) для однієї й тієї ж частини шаблону. Якщо ключовий вираз є кортежем або списком, він буде шукатися під час генерації ключа кешу. Якщо ключовий вираз повертає один або декілька наборів записів, то модель, ідентифікатори та їх відповідна дата запису будуть використані для генерації ключа кешу. Особливий випадок: Якщо ключовий вираз повертає значення Falsy, то вміст не буде кешовано.

Приклад:

<div t-cache="record,bool(condition)">
    <span t-if="condition" t-field="record.partner_id.name">
    <span t-else="" t-field="record.partner_id" t-options-widget="contact">
</div>

У цьому випадку в кеші можуть бути значення (рядки), що відповідають кожному запису, який вже повернуто з умовою true, а також для умови false. І якщо модуль змінює запис, при цьому змінюється write_date, кешоване значення відкидається.

t-cache та значення з областю видимості (t-set, t-foreach…)

Значення в t-cache мають область видимості, це передбачає зміну поведінки між наявністю чи відсутністю t-cache на одному з батьківських вузлів. Не забудьте врахувати, що Odoo використовує багато шаблонів, t-call та успадкування переглядів. Додавання t-cache може змінити відображення шаблону, яке ви не бачите під час редагування. (t-foreach це як t-set для кожної ітерації)

Приклад:

<div>
    <t t-set="a" t-value="1"/>
    <inside>
        <t t-set="a" t-value="2"/>
        <t t-out="a"/>
    </inside>
    <outside t-out="a"/>

    <t t-set="b" t-value="1"/>
    <inside t-cache="True">
        <t t-set="b" t-value="2"/>
        <t t-out="b"/>
    </inside>
    <outside t-out="b"/>
</div>

Відрендерить:

<div>
    <inside>2</inside>
    <outside>2</inside>

    <inside>2</inside>
    <outside>1</inside>
</div>

Основа t-nocache

Частина шаблону, що міститься у вузлі з атрибутом t-nocache, не кешується. Тому цей контент є динамічним і відтворюється систематично. Однак доступні значення – це ті, що надаються контролером (під час виклику методу _render).

Приклад:

<section>
    <article t-cache="record">
        <title><t t-out="record.name"/> <i t-nocache="">(views: <t t-out="counter"/>)</i></titlle>
        <content t-out="record.description"/>
    </article>
</section>

Відрендерить (лічильник = 1):

<section>
    <article>
        <title>The record name <i>(views: 1)</i></titlle>
        <content>Record description</content>
    </article>
</section>

Тут тег <i>, який містить контейнер, завжди буде відображатися. Решта ж зберігатиметься у вигляді одного рядка в кеші.

t-nocache та значення кореневих значень з областю видимості (t-set, t-foreach…)

Вміст тегу t-nocache можна використовувати для документації та пояснення причини додавання директиви. Значення входять до області видимості t-nocache, ці значення є лише кореневими значеннями (значення, надані контролером та/або під час виклику методу _render класу ir.qweb). t-set можна виконати в частині шаблону, але він не буде доступний в інших місцях.

Приклад:

<section>
    <t t-set="counter" t-value="counter * 10"/>
    <header t-nocache="">
        <t t-set="counter" t-value="counter + 5"/>
        (views: <t t-out="counter"/>)
    </header>
    <article t-cache="record">
        <title><t t-out="record.name"/> <i t-nocache="">(views: <t t-out="counter"/>)</i></titlle>
        <content t-out="record.description"/>
    </article>
    <footer>(views: <t t-out="counter"/>)</footer>
</section>

Відрендерить (лічильник = 1):

<section>
    <header>
        (views: 6)
    </header>
    <article>
        <title>The record name <i>(views: 1)</i></titlle>
        <content>Record description</content>
    </article>
    <footer>(views: 10)</footer>
</section>

Тут тег <i>, що містить контейнер, завжди буде відображатися. Решта ж зберігається у вигляді одного рядка в кеші. Лічильник не оновлюється t-set з t-nocache

t-nocache-* додає деякі примітивні значення до кешу

Щоб мати змогу використовувати значення, згенеровані в шаблоні, їх можна кешувати. Директива використовується як t-nocache-*="expr", де * - це назва вибраного значення, а expr - вираз Python, тому результат буде кешовано. Кешоване значення має бути примітивного типу.

Приклад:

<section t-cache="records">
    <article t-foreach="records" t-as="record">
        <header>
            <title t-field="record.get_method_title()"/>
        </header>
        <footer t-nocache="This part has a dynamic counter and must be rendered all the time."
                t-nocache-cached_value="record.get_base_counter()">
            <span t-out="counter + cached_value"/>
        </footer>
    </article>
</section>

Значення cached_value кешується разом із кешованою частиною шаблону t-cache="records" та щоразу додається до кореневих значень області видимості.

Помічники

На основі запитів

Більшість застосувань QWeb на стороні Python відбуваються в контролерах (і під час HTTP-запитів), і в цьому випадку шаблони, що зберігаються в базі даних (як представлення), можна тривіально відобразити, викликавши odoo.http.HttpRequest.render():

response = http.request.render('my-template', {
    'context_value': 42
})

Це автоматично створює об’єкт Response, який можна повернути з контролера (або додатково налаштувати відповідно до нього).

На основі представлення

На глибшому рівні, ніж попередній помічник, знаходиться метод _render на ir.qweb (використовуйте datatable) та метод публічного модуля render (не використовуйте базу даних):

_render(id[, values])

Рендкрить представлення/шаблон QWeb за ідентифікатором бази даних або external id. Шаблони автоматично завантажуються із записів ir.qweb.

Метод _prepare_environment встановлює низку значень за замовчуванням у контексті рендерингу. Доповнення http_routing та website також мають значення за замовчуванням, які їм потрібні. Ви можете використовувати опцію minimal_qcontext=False, щоб уникнути цього значення за замовчуванням, як-от у публічному методі render:

request

поточний об’єкт Request, якщо такий є

debug

чи поточний запит (якщо є) знаходиться в режимі debug

quote_plus

функція утиліти кодування url

json

відповідний модуль стандартної бібліотеки

time

відповідний модуль стандартної бібліотеки

datetime

відповідний модуль стандартної бібліотеки

relativedelta

переглянути модуль

keep_query

допоміжна функція keep_query

Параметри
  • values – значення контексту для передачі в QWeb для візуалізації

  • engine (str) – ім’я моделі Odoo для використання для рендерингу, можна використовувати для локального розширення або налаштування QWeb (шляхом створення «нового» qweb на основі ir.qweb зі змінами)

render(template_name, values, load, **options)
load(ref)()

повертає об’єкт etree, посилання

Javascript

Ексклюзивні директиви

Визначення шаблонів

Директиву t-name можна розмістити лише на верхньому рівні файлу шаблону (направляти дітей до кореня документа):

<templates>
    <t t-name="template-name">
        <!-- template code -->
    </t>
</templates>

Він не приймає інших параметрів, але може використовуватися з елементом <t> або будь-яким іншим. З елементом <t> елемент <t> повинен мати єдиного дочірнього елемента.

Назва шаблону - це довільний рядок, хоча, коли кілька шаблонів пов’язано (наприклад, підшаблони), прийнято використовувати розділені крапками імена для позначення ієрархічних зв’язків.

Спадкування шаблонів

Успадкування шаблону використовується для:
  • Змінювати існуючі шаблони на місці, напр. щоб додати інформацію до шаблонів

створені іншими модулями.
  • Створіть новий шаблон із заданого батьківського шаблону

Успадкування шаблону виконується за допомогою двох директив:
  • t-inherit, це назва шаблону для успадкування,

  • t-inherit-mode, який є поведінкою успадкування: його можна встановити як primary, щоб створити новий дочірній шаблон із батьківського, або extension, щоб змінити батьківський шаблон на місці.

Також можна вказати необов’язкову директиву t-name. Це буде назваою новоствореного шаблону, якщо він використовується в основному режимі, інакше його буде додано як коментар до перетвореного шаблону, щоб допомогти відстежити успадкування.

Для самого успадкування зміни вносяться за допомогою директив xpaths. Перегляньте документацію XPATH, щоб отримати повний набір доступних інструкцій.

Первинне успадкування (дочірній шаблон):

<t t-name="child.template" t-inherit="base.template" t-inherit-mode="primary">
    <xpath expr="//ul" position="inside">
        <li>new element</li>
    </xpath>
</t>

Спадкування розширення (перетворення на місці):

<t t-inherit="base.template" t-inherit-mode="extension">
    <xpath expr="//tr[1]" position="after">
        <tr><td>new cell</td></tr>
    </xpath>
</t>

Старий механізм успадкування (застарілий)

Успадкування шаблону виконується за допомогою директиви t-extend, яка приймає назву шаблону, який потрібно змінити, як параметр.

Директива t-extend діятиме як первинне успадкування в поєднанні з t-name і як розширення, якщо використовується окремо.

В обох випадках зміна виконується за допомогою будь-якої кількості піддиректив t-jquery:

<t t-extend="base.template">
    <t t-jquery="ul" t-operation="append">
        <li>new element</li>
    </t>
</t>

Директиви t-jquery використовують селектор CSS. Цей селектор використовується в розширеному шаблоні для вибору контекстних вузлів, до яких застосована вказана t-операція:

append

тіло вузла додається в кінці вузла контексту (після останнього дочірнього вузла контексту)

prepend

тіло вузла додається до контекстного вузла (вставляється перед першим дочірнім елементом контекстного вузла)

before

тіло вузла вставляється безпосередньо перед вузлом контексту

after

тіло вузла вставляється безпосередньо перед вузлом контексту

inner

тіло вузла замінює дочірніх елементів контекстного вузла

replace

тіло вузла використовується для заміни самого вузла контексту

attributes

тіло вузла має бути будь-якою кількістю елементів attribute, кожен з атрибутом name і деяким текстовим вмістом, іменований атрибут вузла контексту буде встановлено на вказане значення (або замінено, якщо воно вже існувало або додано, якщо ні)

Без операції

якщо t-operation не вказана, тіло шаблону інтерпретується як код javascript і виконується з контекстним вузлом як this

Попередження

хоча цей режим набагато потужніший за інші операції, він також набагато важчий для налагодження та підтримки, рекомендується уникати його

Налагодження

Реалізація javascript QWeb надає кілька гачків для налагодження:

t-log

приймає параметр виразу, обчислює вираз під час візуалізації та записує його результат за допомогою console.log:

<t t-set="foo" t-value="42"/>
<t t-log="foo"/>

виведе 42 на консоль

t-debug

запускає точку зупину налагоджувача під час візуалізації шаблону:

<t t-if="a_test">
    <t t-debug=""/>
</t>

зупинить виконання, якщо налагодження активне (точна умова залежить від браузера та його інструментів розробки)

t-js

тіло вузла - це код javascript, який виконується під час візуалізації шаблону. Приймає параметр context, який є назвою, під якою контекст візуалізації буде доступний у тілі t-js:

<t t-set="foo" t-value="42"/>
<t t-js="ctx">
    console.log("Foo is", ctx.foo);
</t>

Помічники

core.qweb

(ядро - це модуль web.core) Екземпляр QWeb2.Engine() із завантаженими всіма визначеними модулем файлами шаблонів і посиланнями на стандартні допоміжні об’єкти _ (підкреслення), _t (функція перекладу) і JSON.

core.qweb.render можна використовувати для легкого відтворення основних шаблонів модулів

API

class QWeb2.Engine()

«Рендеринг» QWeb обробляє більшість логіки QWeb (завантаження, аналіз, компіляція та візуалізація шаблонів).

Odoo Web створює екземпляр для користувача в основному модулі та експортує його до core.qweb. Він також завантажує всі файли шаблонів різних модулів у цей екземпляр QWeb.

QWeb2.Engine() також служить «простором назв шаблону».

QWeb2.Engine.QWeb2.Engine.render(template[, context])

Відтворює попередньо завантажений шаблон у рядок, використовуючи context (якщо надається) для пошуку змінних, до яких звертаються під час відтворення шаблону (наприклад, рядки для відображення).

Аргументи
  • template (String()) – назва шаблону для візуалізації

  • context (Object()) – основний простір назв для відтворення шаблону

Повертає

Рядок

Механізм надає інший метод, який може бути корисним у деяких випадках (наприклад, якщо вам потрібен окремий простір імен шаблону з, в Odoo Web, представлення Канбан отримують власний екземпляр QWeb2.Engine(), тому їх шаблони не стикаються з більш загальними шаблонами «модулів»):

QWeb2.Engine.QWeb2.Engine.add_template(templates)

Завантажує файл шаблону (набір шаблонів) в примірник QWeb. Шаблони можна вказати як:

Рядок XML

QWeb спробує розібрати його до документа XML, а потім завантажити.

URL

QWeb спробує завантажити вміст URL-адреси, а потім завантажити отриманий рядок XML.

Документ або Вузол

QWeb пройде перший рівень документа (дочірні вузли наданого кореня) і завантажить будь-який названий шаблон або перевизначення шаблону.

QWeb2.Engine() також надає різні атрибути для налаштування поведінки:

QWeb2.Engine.QWeb2.Engine.prefix

Префікс, який використовується для розпізнавання директив під час аналізу. Рядок. За замовчуванням t.

QWeb2.Engine.QWeb2.Engine.debug

Логічний прапор, що переводить движок у «режим налагодження». Зазвичай QWeb перехоплює будь-яку помилку, яка виникає під час виконання шаблону. У режимі налагодження він залишає всі винятки проходити без їх перехоплення.

QWeb2.Engine.QWeb2.Engine.jQuery

Екземпляр jQuery, який використовується під час обробки успадкування шаблону. За замовчуванням window.jQuery.

QWeb2.Engine.QWeb2.Engine.preprocess_node

Функція. Якщо є, викликається перед компіляцією кожного вузла DOM у код шаблону. В Odoo Web це використовується для автоматичного перекладу текстового вмісту та деяких атрибутів у шаблонах. За замовчуванням null.

1

він схожий на Genshi, хоча не використовує (і не підтримує) простори назв XML

2

хоча він використовує кілька інших, або з історичних причин, або тому, що вони залишаються кращими для використання. Odoo 9.0 все ще залежить від Jinja і Mako.