Một nút được tạo ra từ mỗi thẻ. Bạn có thể có được ý tưởng về cách hoạt động của nó bằng cách đọc qua how to write custom tags. Bất cứ thứ gì bên trong thẻ sẽ là con của nó. Dưới đây là ví dụ về thẻ nhận xét từ tài liệu django:
def do_comment(parser, token):
nodelist = parser.parse(('endcomment',))
parser.delete_first_token()
return CommentNode()
khi bạn thấy thẻ nhận xét sẽ phân tích mọi thứ cho đến khi "kết thúc" và sẽ vứt đi. Các thẻ khác sẽ vượt qua nodelist
đến SometagNode()
và sẽ sử dụng thẻ để hiển thị.
Hiển thị được thực hiện đệ quy. Khi một render() được gọi trên nút nó chạy render trên các con của nó và cứ thế.
Phân tích cú pháp được thực hiện một cách đệ quy, đây là lý do tại sao bạn có thể nhận thẻ lồng nhau và parser.parse()
sẽ quản lý để tìm thẻ đóng phù hợp phù hợp, vì khi phân tích cú pháp và tình cờ trên thẻ gọi là do_tag()
. các parser.parse()
một lần nữa để tìm thẻ đóng gần nhất và sẽ bọc tất cả mọi thứ vào một nút, trả về một nút, parser.parse cao hơn() sẽ đặt nó vào một danh sách nút và sẽ tiếp tục tìm kiếm thẻ đóng.
Đối tượng ngữ cảnh trong các nút là một loại danh sách cấu trúc dicts. Thêm bối cảnh được đẩy trên đầu trang của bối cảnh hiện tại và thông qua cho các nút trẻ em và popped ra sau khi nút được trả lại để nó sẽ không ảnh hưởng đến phạm vi trên.
Đối với các thẻ không có trẻ em, parser.parse()
không được sử dụng và do đó, thể hiện nút được trả về mà không có bất kỳ trẻ em nào.
Tôi bắt đầu đọc 'django.template.base' nhưng đã nhận ra ngay sau khi tôi cảm nhận được phép thuật uốn cong mạnh mẽ, thời gian (như goto 5am). Tôi sẽ upvote và kiểm tra vào buổi sáng thay vì :) –
Tôi đã đặt nó vào danh sách việc cần làm của tôi! –