Mẫu QWeb

QWeb là công cụ tạo khuôn mẫu chính được sử dụng bởi SoOn2. Nó là một công cụ tạo khuôn mẫu XML1 và được sử dụng chủ yếu để tạo các đoạn và trang HTML.

Các chỉ thị mẫu được chỉ định dưới dạng các thuộc tính XML có tiền tố t-, ví dụ t-if cho Câu điều kiện, với các phần tử và các thuộc tính khác được hiển thị trực tiếp.

Để tránh hiển thị phần tử, phần tử giữ chỗ <t> cũng có sẵn, phần tử này thực thi lệnh của nó nhưng không tạo ra bất kỳ đầu ra nào trong chính nó:

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

sẽ cho kết quả:

<p>Test</p>

nếu điều kiện là đúng, nhưng:

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

sẽ cho kết quả:

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

Đầu ra dữ liệu

Lệnh đầu ra out của QWeb sẽ tự động thoát khỏi đầu vào HTML của nó, hạn chế rủi ro XSS khi hiển thị nội dung do người dùng cung cấp.

out nhận một biểu thức, đánh giá nó và đưa kết quả vào tài liệu:

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

được kết xuất với giá trị value được đặt thành 42 mang lại:

<p>42</p>

Xem Đầu ra nâng cao để biết các chủ đề nâng cao hơn (ví dụ: chèn HTML thô, v.v...).

Câu điều kiện

QWeb có một lệnh có điều kiện if, đánh giá một biểu thức được đưa ra dưới dạng giá trị thuộc tính:

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

Phần tử được hiển thị nếu điều kiện đúng:

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

nhưng nếu điều kiện sai thì nó sẽ bị xóa khỏi kết quả

<div>
</div>

Việc hiển thị có điều kiện áp dụng cho phần tử mang lệnh, không nhất thiết phải là <t>:

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

sẽ cho kết quả tương tự như ví dụ trước.

Các chỉ thị phân nhánh có điều kiện bổ sung t-elift-else cũng có sẵn

<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>

Vòng lặp

QWeb có một lệnh lặp foreach lấy một biểu thức trả về bộ sưu tập để lặp lại và tham số thứ hai t-as cung cấp tên để sử dụng cho "mục hiện tại" của lần lặp:

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

sẽ được hiển thị dưới dạng:

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

Giống như các điều kiện, foreach áp dụng cho phần tử mang thuộc tính của lệnh và

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

tương đương với ví dụ trước.

foreach có thể lặp trên một mảng (mục hiện tại sẽ là giá trị hiện tại) hoặc ánh xạ (mục hiện tại sẽ là khóa hiện tại). Việc lặp lại trên một số nguyên (tương đương với việc lặp lại trên một mảng nằm trong khoảng từ 0 đến không bao gồm số nguyên được cung cấp) vẫn được hỗ trợ nhưng không được dùng nữa.

Ngoài tên được truyền qua t-as, foreach còn cung cấp một số biến khác cho các điểm dữ liệu khác nhau:

Cảnh báo

$as sẽ được thay thế bằng tên được truyền cho t-as

{$as__all (không dùng nữa)

đối tượng được lặp đi lặp lại

Ghi chú

Biến này chỉ có trên JavaScript QWeb, không có trên Python.

{$as__value

giá trị lặp hiện tại, giống hệt $as đối với danh sách và số nguyên, nhưng đối với ánh xạ, nó cung cấp giá trị (trong đó $as cung cấp khóa)

{$as__index

chỉ số lặp hiện tại (mục đầu tiên của lần lặp có chỉ số 0)

{$as__size

kích thước của bộ sưu tập nếu nó có sẵn

{$as__first

liệu mục hiện tại có phải là mục đầu tiên trong lần lặp hay không (tương đương với {$as__index == 0)

{$as__last

liệu mục hiện tại có phải là mục cuối cùng của lần lặp hay không (tương đương với {$as__index + 1 == {$as__size), yêu cầu phải có sẵn kích thước của iteratee

{$as__parity (không dùng nữa)

"chẵn" hoặc "lẻ", tính chẵn lẻ của vòng lặp hiện tại

{$as__even (không dùng nữa)

một cờ boolean chỉ ra rằng vòng lặp hiện tại nằm trên một chỉ mục chẵn

{$as__odd (không dùng nữa)

một cờ boolean chỉ ra rằng vòng lặp hiện tại nằm trên một chỉ số lẻ

Các biến bổ sung được cung cấp này và tất cả các biến mới được tạo trong foreach chỉ có sẵn trong phạm vi của foreach. Nếu biến tồn tại bên ngoài ngữ cảnh của foreach, giá trị sẽ được sao chép ở cuối foreach vào ngữ cảnh chung.

<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 -->

thuộc tính

QWeb có thể tính toán các thuộc tính một cách nhanh chóng và đặt kết quả tính toán trên nút đầu ra. Việc này được thực hiện thông qua lệnh t-att (thuộc tính) tồn tại ở 3 dạng khác nhau:

t-att-$name

một thuộc tính có tên $name được tạo, giá trị thuộc tính được đánh giá và kết quả được đặt làm giá trị của thuộc tính:

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

sẽ được hiển thị dưới dạng:

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

giống như trước, nhưng tham số là format string thay vì chỉ là một biểu thức, thường hữu ích để trộn chuỗi ký tự và không phải ký tự (ví dụ: các lớp):

<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>

sẽ được hiển thị dưới dạng:

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

Mẹo

Có hai cú pháp tương đương cho chuỗi định dạng: "plain_text {{code}}" (còn gọi là jinja-style) và "plain_text #{code}" (còn gọi là ruby-style).

t-att=ánh xạ

nếu tham số là ánh xạ, mỗi cặp (khóa, giá trị) sẽ tạo một thuộc tính mới và giá trị của nó

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

sẽ được hiển thị dưới dạng:

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

nếu tham số là một cặp (bộ hoặc mảng gồm 2 phần tử), mục đầu tiên của cặp là tên của thuộc tính và mục thứ hai là giá trị:

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

sẽ được hiển thị dưới dạng:

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

thiết lập các biến

QWeb cho phép tạo các biến từ bên trong mẫu, ghi nhớ một phép tính (để sử dụng nó nhiều lần), đặt tên rõ ràng hơn cho một phần dữ liệu, ...

Việc này được thực hiện thông qua lệnh set, lệnh này lấy tên của biến cần tạo. Giá trị cần đặt có thể được cung cấp theo hai cách:

  • một thuộc tính t-value chứa một biểu thức và kết quả đánh giá của nó sẽ được đặt:

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

    sẽ in 3

  • nếu không có thuộc tính t-value, phần thân của nút sẽ được hiển thị và đặt làm giá trị của biến:

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

gọi các mẫu phụ

Các mẫu QWeb có thể được sử dụng để hiển thị cấp cao nhất, nhưng chúng cũng có thể được sử dụng từ bên trong một mẫu khác (để tránh trùng lặp hoặc đặt tên cho các phần của mẫu) bằng cách sử dụng lệnh t-call:

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

Lệnh này gọi mẫu được đặt tên với ngữ cảnh thực thi của mẫu gốc, nếu other_template được định nghĩa là:

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

lệnh gọi ở trên sẽ được hiển thị dưới dạng <p/> (không có nội dung), nhưng:

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

sẽ được hiển thị dưới dạng <p>1</p>.

Tuy nhiên, điều này có vấn đề là hiển thị từ bên ngoài t-call. Ngoài ra, nội dung được đặt trong phần nội dung của lệnh call sẽ được đánh giá trước khi gọi mẫu phụ và có thể thay đổi ngữ cảnh cục bộ:

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

Phần thân của lệnh call có thể phức tạp tùy ý (không chỉ các lệnh set) và dạng được hiển thị của nó sẽ có sẵn trong mẫu được gọi dưới dạng biến 0 ma thuật:

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

được gọi như vậy:

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

sẽ cho kết quả:

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

Đầu ra nâng cao

Theo mặc định, out sẽ thoát nội dung HTML cần thoát, bảo vệ hệ thống khỏi XSS

Thay vào đó, nội dung không cần phải thoát sẽ được đưa vào nguyên trạng trong tài liệu và có thể trở thành một phần của đánh dấu thực tế của tài liệu.

Nội dung "an toàn" đa nền tảng duy nhất là đầu ra của t-call hoặc t-set được sử dụng với "body " (ngược lại với t-value hoặc t-valuef).

Python

Thông thường, bạn không cần phải quan tâm quá nhiều: các API phù hợp sẽ tự động tạo ra nội dung "an toàn" và mọi thứ sẽ hoạt động một cách minh bạch.

Đối với những trường hợp mọi thứ cần phải rõ ràng hơn mặc dù các API sau xuất ra nội dung an toàn, theo mặc định sẽ không bị thoát (lại) khi được đưa vào mẫu:

  • Các trường HTML.

  • html_escape()markupsafe.escape() (chúng là bí danh và không có nguy cơ thoát kép).

  • html_sanitize().

  • markupsafe.Markup.

    Cảnh báo

    markupsafe.Markup là một API không an toàn, đó là xác nhận rằng bạn muốn nội dung được đánh dấu an toàn nhưng nhất thiết không thể kiểm tra điều đó, bạn nên sử dụng nó một cách cẩn thận.

  • to_text() không đánh dấu nội dung là an toàn nhưng sẽ không loại bỏ thông tin đó khỏi nội dung an toàn.

buộc phải thoát kép

Nếu nội dung được đánh dấu là an toàn nhưng vì lý do nào đó cần phải thoát (ví dụ: in đánh dấu của các trường HTML), nội dung đó có thể được chuyển đổi trở lại thành chuỗi bình thường để "tước" cờ an toàn, ví dụ: str(content) trong Python và String(content) trong Javascript.

Ghi chú

Bởi vì Markup là loại phong phú hơn nhiều so với Markup(), một số thao tác sẽ loại bỏ thông tin an toàn khỏi Markup() chứ không phải Markup vd nối chuỗi ('' + content) trong Python sẽ dẫn đến Markup với toán hạng khác đã được thoát đúng cách, trong khi ở Javascript sẽ mang lại String() trong đó toán hạng kia không thoát trước khi nối.

Chỉ thị đầu ra không được dùng nữa

`` esc``

Bí danh cho out, ban đầu sẽ thoát khỏi đầu vào HTML của nó. Chưa chính thức bị phản đối vì sự khác biệt duy nhất giữa outesc là cái sau hơi không rõ ràng/không chính xác.

thô

Một phiên bản của out không bao giờ thoát khỏi nội dung của nó. Nội dung được phát ra nguyên trạng, cho dù nó có an toàn hay không.

Sắp loại bỏ từ phiên bản 15.0: Thay vào đó, hãy sử dụng out với giá trị markupsafe.Markup.

t-raw không được dùng nữa vì khi mã sản xuất nội dung phát triển, khó có thể theo dõi xem liệu nó sẽ được sử dụng để đánh dấu hay không, dẫn đến việc đánh giá phức tạp hơn và nhiều sai sót nguy hiểm hơn.

Python

Chỉ thị độc quyền

Gói tài sản

Định dạng trường "bản ghi thông minh"

Lệnh t-field chỉ có thể được sử dụng khi thực hiện truy cập trường (a.b) trên bản ghi "thông minh" (kết quả của phương thức browse). Nó có thể tự động định dạng dựa trên loại trường và được tích hợp trong tính năng chỉnh sửa văn bản đa dạng thức của trang web.

t-options có thể được sử dụng để tùy chỉnh các trường, tùy chọn phổ biến nhất là widget, các tùy chọn khác phụ thuộc vào trường hoặc phụ thuộc vào widget.

Gỡ lỗi

t-gỡ lỗi

với một giá trị trống, gọi hàm dựng sẵn breakpoint(), hàm này thường gọi một trình gỡ lỗi (pdb theo mặc định).

Hành vi này có thể được định cấu hình thông qua PYTHONBREAKPOINT hoặc sys.breakpointhook().

Hiển thị bộ đệm:

t-cache="key_cache" gắn thẻ một phần của mẫu sẽ được lưu vào bộ đệm tại thời điểm kết xuất. Mọi chỉ thị phụ sẽ chỉ được gọi trong lần hiển thị đầu tiên. Điều đó có nghĩa là các truy vấn sql được thực thi trong quá trình hiển thị các chỉ thị phụ đó cũng chỉ được thực hiện một lần.

t-nocache="documentation" gắn thẻ một phần của mẫu để được hiển thị mọi lúc. Nội dung chỉ có thể sử dụng các giá trị gốc.

Tại sao và khi nào nên sử dụng t-cache?

Lệnh này được sử dụng để tăng tốc độ hiển thị, bằng cách lưu vào bộ đệm các phần của tài liệu cuối cùng, có thể lưu các truy vấn vào cơ sở dữ liệu. Tuy nhiên, nên sử dụng nó một cách tiết kiệm, vì t-cache chắc chắn sẽ làm phức tạp các mẫu (và sự hiểu biết của họ về t-set chẳng hạn).

Tuy nhiên, để thực sự lưu các truy vấn cơ sở dữ liệu, có thể cần phải hiển thị mẫu với các giá trị được đánh giá một cách lười biếng. Nếu các giá trị lười biếng đó được sử dụng trong phần được lưu trong bộ đệm, chúng sẽ không được đánh giá nếu phần đó có sẵn trong bộ nhớ đệm.

Lệnh t-cache rất hữu ích cho các phần của mẫu sử dụng các giá trị phụ thuộc vào một lượng dữ liệu hạn chế. Chúng tôi khuyên bạn nên phân tích việc hiển thị mẫu bằng trình lược tả (bằng cách kích hoạt tùy chọn "Thêm ngữ cảnh chỉ thị qweb"). Việc chuyển các giá trị lười biếng sang kết xuất trong bộ điều khiển cho phép bạn hiển thị các lệnh bằng cách sử dụng các giá trị này và kích hoạt các truy vấn.

Mối lo ngại về việc sử dụng bộ nhớ đệm như vậy là khiến nó có sẵn cho những người dùng khác nhau (những người dùng khác nhau phải hiển thị các phần được lưu trong bộ nhớ đệm theo cùng một cách). Một vấn đề tiềm ẩn khác là vô hiệu hóa các mục nhập của nó khi cần thiết. Đối với trường hợp sau, biểu thức khóa phải được chọn một cách khôn ngoan. Chẳng hạn, việc sử dụng write_date của một tập bản ghi có thể làm cho khóa bộ đệm trở nên lỗi thời mà không cần phải loại bỏ nó một cách rõ ràng khỏi bộ đệm.

Người ta cũng nên chú ý đến thực tế là các giá trị trong các phần t-cache đều nằm trong phạm vi. Điều này ngụ ý rằng nếu có các lệnh t-set trong phần này của mẫu, thì việc hiển thị những gì xảy ra sau nó có thể khác so với khi không có lệnh t-cache.

Điều gì sẽ xảy ra nếu có một t-cache bên trong t-cache?

Các bộ phận được lưu trữ. Mỗi cái chỉ chứa chuỗi tương ứng với kết xuất của nó. Vì vậy, t-cache bên trong có thể sẽ ít được đọc hơn, key bộ đệm của nó sẽ không nhất thiết phải được sử dụng. Nếu đúng như vậy thì bạn có thể cần thêm t-nocache (trên cùng một nút hoặc nút cha).

t-nocache dùng để làm gì?

If you want to cache part of a template with t-cache but a small piece must remain dynamic and be evaluated at cache times. However, the part in t-nocache will not have access to the t-set value of the template. Only the values ​​provided by the controller are accessible there. For example, the menu is cached because it's the same all the time and takes time to render (using the performance devtools with the qweb context lets you investigate). However, in the menu, we want the ecommerce cart to be always up to date. So there is a t-nocache to keep this part dynamic.

Cơ sở của t-cache

Lệnh t-cache cho phép bạn lưu trữ kết quả được hiển thị của một mẫu. biểu thức khóa (ví dụ: 42: t-cache="42") sẽ được đánh giá là biểu thức python. Điều này sẽ được sử dụng để tạo khóa bộ đệm. Vì vậy, có thể có giá trị bộ đệm (phần kết xuất được lưu trong bộ nhớ đệm) khác nhau cho cùng một phần mẫu. Nếu biểu thức khóa là một bộ hoặc một danh sách, nó sẽ được tìm kiếm khi tạo khóa bộ đệm. Nếu một hoặc nhiều tập bản ghi được trả về bằng biểu thức khóa thì mô hình, id và write_date tương ứng của chúng sẽ được sử dụng để tạo khóa bộ đệm. Trường hợp đặc biệt: Nếu biểu thức khóa trả về giá trị Sai thì nội dung sẽ không được lưu vào bộ nhớ đệm.

Ví dụ:

<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>

In this case, there may be values ​​(string) in the cache corresponding to each record already returned with a true condition, as well as for the false condition. And if a module modifies the record, the write_date being modified, the cached value is discarded.

t-cache và các giá trị trong phạm vi (t-set, t-foreach...)

Các giá trị trong t-cache có phạm vi, điều này liên quan đến sự thay đổi trong hành vi giữa việc có hoặc không có t-cache trên một trong các nút cha. Đừng quên lưu ý rằng SoOn sử dụng rất nhiều mẫu, t-call và xem tính kế thừa. Do đó, việc thêm t-cache có thể sửa đổi kết xuất của một mẫu mà bạn không thấy khi chỉnh sửa. (t-foreach nó giống như một t-set cho mỗi lần lặp)

Ví dụ:

<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>

Sẽ kết xuất:

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

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

Cơ sở của t-nocache

Phần mẫu chứa trong nút có thuộc tính t-nocache không được lưu vào bộ đệm. Do đó, nội dung này động và được hiển thị một cách có hệ thống. Tuy nhiên, các giá trị khả dụng là những giá trị được cung cấp bởi bộ điều khiển (khi gọi phương thức _render).

Ví dụ:

<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>

Sẽ hiển thị (bộ đếm = 1):

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

Ở đây thẻ <i> chứa vùng chứa sẽ luôn được hiển thị. Trong khi phần còn lại ở dạng một chuỗi trong bộ đệm.

t-nocache và các giá trị gốc trong phạm vi (t-set, t-foreach...)

Nội dung của thẻ t-nocache có thể được sử dụng làm tài liệu và giải thích lý do tại sao lệnh này được thêm vào. Các giá trị nằm trong phạm vi t-nocache, các giá trị này chỉ là giá trị gốc (các giá trị được cung cấp bởi bộ điều khiển và/hoặc khi gọi phương thức _render của ir.qweb). t-set có thể được thực hiện trong phần mẫu, nhưng sẽ không có ở nơi khác.

Ví dụ:

<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>

Sẽ hiển thị (bộ đếm = 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>

Ở đây thẻ <i> chứa vùng chứa sẽ luôn được hiển thị. Trong khi phần còn lại ở dạng một chuỗi trong bộ đệm. Bộ đếm không được cập nhật bởi t-set ngoài t-nocache

t-nocache-* thêm một số giá trị nguyên thủy vào bộ đệm

Để có thể sử dụng các giá trị được tạo trong mẫu, bạn có thể lưu chúng vào bộ đệm. Lệnh này được sử dụng dưới dạng t-nocache-*="expr" trong đó * là tên của giá trị được chọn và expr biểu thức python nên kết quả sẽ được lưu vào bộ đệm. Giá trị được lưu trong bộ nhớ cache phải là loại nguyên thủy.

Ví dụ:

<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>

Giá trị cached_value được lưu vào bộ nhớ đệm cùng với phần mẫu được lưu trong bộ nhớ đệm của t-cache="records" và thêm vào các giá trị gốc trong phạm vi mỗi lần.

Người trợ giúp

Dựa trên yêu cầu

Hầu hết việc sử dụng QWeb phía Python đều nằm trong bộ điều khiển (và trong các yêu cầu HTTP), trong trường hợp đó các mẫu được lưu trữ trong cơ sở dữ liệu (dưới dạng views) có thể được hiển thị một cách tầm thường bằng cách gọi :meth: odoo.http.HttpRequest.render:

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

Điều này sẽ tự động tạo một đối tượng Response có thể được trả về từ bộ điều khiển (hoặc được tùy chỉnh thêm cho phù hợp).

Dựa trên chế độ xem

Ở mức độ sâu hơn so với trình trợ giúp trước đó là phương thức _render trên ir.qweb (sử dụng bảng dữ liệu) và phương thức mô-đun công khai render (không sử dụng cơ sở dữ liệu):

_render(id[, values])

Hiển thị chế độ xem/mẫu QWeb theo id cơ sở dữ liệu hoặc id bên ngoài. Các mẫu được tải tự động từ các bản ghi ir.qweb.

Phương thức _prepare_environment thiết lập một số giá trị mặc định trong ngữ cảnh hiển thị. Các tiện ích bổ sung http_routingwebsite cũng là các giá trị mặc định mà chúng cần. Bạn có thể sử dụng tùy chọn minimal_qcontext=False để tránh giá trị mặc định này giống như phương thức công khai render:

yêu cầu

đối tượng Request hiện tại, nếu có

gỡ lỗi

liệu yêu cầu hiện tại (nếu có) có ở chế độ debug không

quote_plus

chức năng tiện ích mã hóa url

json

mô-đun thư viện tiêu chuẩn tương ứng

thời gian

mô-đun thư viện tiêu chuẩn tương ứng

ngày giờ

mô-đun thư viện tiêu chuẩn tương ứng

relativedelta

xem mô-đun

keep_query

hàm trợ giúp keep_query

Tham số
  • values -- các giá trị ngữ cảnh cần chuyển tới QWeb để hiển thị

  • engine (str) -- tên của mô hình SoOn để sử dụng để hiển thị, có thể được sử dụng để mở rộng hoặc tùy chỉnh QWeb cục bộ (bằng cách tạo qweb "mới" dựa trên ir.qweb với các thay đổi)

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

trả về đối tượng etree, ref

Javascript

Chỉ thị độc quyền

Xác định mẫu

Lệnh t-name chỉ có thể được đặt ở cấp cao nhất của tệp mẫu (hướng các phần tử con đến thư mục gốc của tài liệu):

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

Nó không cần tham số nào khác nhưng có thể được sử dụng với phần tử <t> hoặc bất kỳ phần tử nào khác. Với phần tử <t>, <t> phải có một phần tử con.

Tên mẫu là một chuỗi tùy ý, mặc dù khi nhiều mẫu có liên quan với nhau (ví dụ: được gọi là mẫu phụ), thông thường người ta sử dụng các tên được phân tách bằng dấu chấm để biểu thị mối quan hệ phân cấp.

Kế thừa mẫu

Kế thừa mẫu được sử dụng để:
  • Thay đổi các mẫu hiện có tại chỗ, ví dụ: để thêm thông tin vào mẫu

được tạo bởi các mô-đun khác.
  • Tạo mẫu mới từ mẫu gốc nhất định

Kế thừa mẫu được thực hiện thông qua việc sử dụng hai lệnh:
  • t-inherit là tên của mẫu cần kế thừa,

  • t-inherit-mode là hành vi của sự kế thừa: nó có thể được đặt thành chính để tạo một mẫu con mới từ mẫu gốc hoặc thành tiện ích mở rộng để thay đổi mẫu gốc tại chỗ.

Một lệnh t-name tùy chọn cũng có thể được chỉ định. Nó sẽ là tên của mẫu mới được tạo nếu được sử dụng ở chế độ chính, nếu không nó sẽ được thêm dưới dạng nhận xét trên mẫu đã chuyển đổi để giúp truy xuất các quyền kế thừa.

Đối với chính quyền kế thừa, các thay đổi được thực hiện bằng cách sử dụng chỉ thị xpaths. Xem tài liệu XPATH để biết bộ hướng dẫn có sẵn đầy đủ.

Kế thừa chính (mẫu con):

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

Kế thừa mở rộng (chuyển đổi tại chỗ):

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

Cơ chế kế thừa cũ (không dùng nữa)

Kế thừa mẫu được thực hiện thông qua lệnh t-extend lấy tên của mẫu cần thay đổi làm tham số.

Lệnh t-extend sẽ hoạt động như một phần thừa kế chính khi được kết hợp với t-name và như một phần mở rộng khi được sử dụng một mình.

Trong cả hai trường hợp, việc thay đổi sau đó được thực hiện với bất kỳ số lượng chỉ thị phụ t-jquery nào:

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

Lệnh t-jquery sử dụng bộ chọn CSS. Bộ chọn này được sử dụng trên mẫu mở rộng để chọn nút ngữ cảnht-Operation đã chỉ định được áp dụng:

`` nối thêm``

phần thân của nút được thêm vào cuối nút ngữ cảnh (sau nút con cuối cùng của nút ngữ cảnh)

`` trả trước``

phần thân của nút được thêm vào trước nút ngữ cảnh (được chèn trước nút con đầu tiên của nút ngữ cảnh)

trước

phần thân của nút được chèn ngay trước nút ngữ cảnh

sau

phần thân của nút được chèn ngay sau nút ngữ cảnh

`` bên trong``

phần thân của nút thay thế nút con của nút ngữ cảnh

thay thế

phần thân của nút được sử dụng để thay thế chính nút ngữ cảnh

thuộc tính

Phần thân của các nút phải là bất kỳ số phần tử thuộc tính nào, mỗi phần tử có một thuộc tính name và một số nội dung văn bản, thuộc tính được đặt tên của nút ngữ cảnh sẽ được đặt thành giá trị được chỉ định (hoặc được thay thế nếu nó đã tồn tại hoặc thêm vào nếu không)

Không hoạt động

nếu không chỉ định t-Opera, nội dung mẫu sẽ được hiểu là mã javascript và được thực thi với nút ngữ cảnh là this

Cảnh báo

mặc dù mạnh hơn nhiều so với các hoạt động khác, nhưng chế độ này cũng khó gỡ lỗi và bảo trì hơn nhiều, bạn nên tránh nó

gỡ lỗi

Việc triển khai QWeb javascript cung cấp một số Hooks gỡ lỗi:

t-log

lấy một tham số biểu thức, đánh giá biểu thức trong khi hiển thị và ghi lại kết quả của nó bằng console.log:

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

sẽ in 42 ra bàn điều khiển

t-gỡ lỗi

kích hoạt điểm dừng của trình gỡ lỗi trong quá trình hiển thị mẫu:

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

sẽ dừng thực thi nếu quá trình gỡ lỗi được kích hoạt (điều kiện chính xác phụ thuộc vào trình duyệt và các công cụ phát triển của nó)

t-js

phần thân của nút là mã javascript được thực thi trong quá trình hiển thị mẫu. Nhận một tham số context, là tên mà bối cảnh hiển thị sẽ có sẵn trong phần thân của t-js:

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

Người trợ giúp

core.qweb

(lõi là mô-đun web.core) Một phiên bản của QWeb2.Engine() với tất cả các tệp mẫu do mô-đun xác định được tải và các tham chiếu đến các đối tượng trợ giúp tiêu chuẩn _ (gạch dưới), _t (hàm dịch) và JSON.

core.qweb.render có thể được sử dụng để dễ dàng hiển thị các mẫu mô-đun cơ bản

API

class QWeb2.Engine()

"Trình kết xuất" QWeb xử lý hầu hết logic của QWeb (tải, phân tích cú pháp, biên dịch và hiển thị mẫu).

SoOn Web khởi tạo một tệp cho người dùng trong mô-đun lõi và xuất nó sang core.qweb. Nó cũng tải tất cả các tệp mẫu của các mô-đun khác nhau vào phiên bản QWeb đó.

A QWeb2.Engine() cũng đóng vai trò là "không gian tên mẫu".

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

Hiển thị một mẫu đã tải trước đó thành một Chuỗi, sử dụng bối cảnh (nếu được cung cấp) để tìm các biến được truy cập trong quá trình hiển thị mẫu (ví dụ: các chuỗi cần hiển thị).

Đối số
  • template (String()) -- tên của mẫu để hiển thị

  • context (Object()) -- không gian tên cơ bản để sử dụng cho việc hiển thị mẫu

Trả về

Sợi dây

Công cụ này hiển thị một phương thức khác có thể hữu ích trong một số trường hợp (ví dụ: nếu bạn cần một không gian tên mẫu riêng biệt, trong SoOn Web, các chế độ xem Kanban sẽ có phiên bản QWeb2.Engine() của riêng chúng để các mẫu của chúng không va chạm với các mẫu "mô-đun" tổng quát hơn):

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

Tải tệp mẫu (tập hợp các mẫu) trong phiên bản QWeb. Các mẫu có thể được chỉ định là:

Một chuỗi XML

QWeb sẽ cố gắng phân tích nó thành tài liệu XML rồi tải nó.

một URL

QWeb sẽ cố tải xuống nội dung URL, sau đó tải chuỗi XML kết quả.

Một Tài liệu hoặc `` Nút``

QWeb sẽ duyệt qua cấp độ đầu tiên của tài liệu (các nút con của gốc được cung cấp) và tải bất kỳ mẫu có tên hoặc ghi đè mẫu nào.

A QWeb2.Engine() cũng hiển thị nhiều thuộc tính khác nhau để tùy chỉnh hành vi:

QWeb2.Engine.QWeb2.Engine.prefix

Tiền tố dùng để nhận biết các chỉ thị trong quá trình phân tích cú pháp. Một chuỗi. Theo mặc định, t.

QWeb2.Engine.QWeb2.Engine.debug

Cờ Boolean đặt động cơ ở "chế độ gỡ lỗi". Thông thường, QWeb chặn mọi lỗi phát sinh trong quá trình thực thi mẫu. Trong chế độ gỡ lỗi, nó để lại tất cả các ngoại lệ mà không chặn chúng.

QWeb2.Engine.QWeb2.Engine.jQuery

Phiên bản jQuery được sử dụng trong quá trình xử lý kế thừa mẫu. Mặc định là window.jQuery.

QWeb2.Engine.QWeb2.Engine.preprocess_node

Một Chức năng. Nếu có, hãy gọi trước khi biên dịch từng nút DOM thành mã mẫu. Trong SoOn Web, tính năng này được sử dụng để tự động dịch nội dung văn bản và một số thuộc tính trong mẫu. Mặc định là `` null``.

1

nó tương tự như Genshi, mặc dù nó không sử dụng (và không hỗ trợ) không gian tên XML

2

mặc dù nó sử dụng một vài cái khác, vì lý do lịch sử hoặc vì chúng vẫn phù hợp hơn với trường hợp sử dụng. SoOn 9.0 vẫn phụ thuộc vào JinjaMako.