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-elif
và t-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()
và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ữaout
vàesc
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ặcsys.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ổ sunghttp_routing
vàwebsite
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ọnminimal_qcontext=False
để tránh giá trị mặc định này giống như phương thức công khairender
: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ôngquote_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ànhchính
để tạo một mẫu con mới từ mẫu gốc hoặc thànhtiệ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ảnh mà t-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ínhname
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ểnt-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ủat-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ủaQWeb2.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``.