2010-02-02 42 views
15

Đối với một dự án mới, chúng tôi đang viết tài liệu về hệ thống mẫu Django. Chúng tôi sử dụng Django cho dự án tài liệu chính nó quá, do đó, Django chọn lên tất cả các biến mẫu của chúng tôi trong mã mẫu và cố gắng để render chúng. Cách duy nhất chúng tôi tìm thấy để giải quyết vấn đề này là sử dụng {% templatetag %}, nhưng điều đó làm cho mã của chúng tôi thực sự không thể đọc được. Có cách nào để làm cho Django bỏ qua tất cả các biến mẫu trong một phần cụ thể?Cách dễ dàng để thoát khỏi các biến mẫu Django

+0

+1 - Câu hỏi hay. Tôi cũng muốn biết câu trả lời. – sberry

Trả lời

7

Do những hạn chế trong mẫu lexer Django (như là một bản hack kludgy), điều này là không thể. Tuy nhiên, nếu bạn sẵn sàng đặt mã ví dụ của bạn trong các tập tin riêng biệt, bạn có thể sử dụng ssi tag:

{% ssi /path/to/my/code/examples/example01.html %} 

Và nó sẽ không phân tích các tập tin, chỉ bao gồm nó đúng nguyên văn. Tuy nhiên, điều này cũng có những hạn chế ở chỗ bạn không thể sử dụng biến trong đường dẫn bao gồm (ví dụ: nếu bạn di chuyển vị trí mẫu, bạn phải viết lại hoặc ít nhất tìm và thay thế tệp mẫu của mình) và bạn phải đưa vào đường dẫn (tức là /path/to/my/code/examples) trong cài đặt ALLOWED_INCLUDE_ROOTS trong số settings.py của bạn. (Xem http://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi.)

+2

+1 cho "như là một hack kludgy". –

+1

Ha, giải pháp ban đầu của chúng tôi là làm điều này với ajax, hoặc sử dụng "[" thay vì "{" và thay thế chúng trở lại bằng javascript. Nếu không ai khác sẽ nghĩ ra điều gì đó tốt hơn, tôi đoán bạn đã trả lời nó. –

+0

Tôi thích ý tưởng "'[' và trao đổi với JS" của bạn tốt hơn. – lawrence

3

Một giải pháp có thể là viết các mẫu như bình thường (với {{ x }}), nhưng lưu chúng dưới dạng .txt (hoặc bất kỳ tiện ích mở rộng nào khác mà bạn muốn). Viết một tập lệnh chạy trên các tệp này và tự động tạo .html cho bạn, bằng cách làm ngược lại templatetag (thay thế {{ bằng {% templatetag openvariable %} v.v.). Đảm bảo mã chạy sau khi bạn cập nhật mẫu.

3

Tôi đã giải quyết vấn đề này bằng cách thêm thẻ mẫu "include_raw" hoạt động giống như thẻ "bao gồm" được tích hợp sẵn, nhưng không phân tích cú pháp hoặc xử lý tệp được truyền cho nó. Tôi đang chạy Django 1.2 trong App Engine.

Tạo một module thẻ (tags.py):

from django.template import loader 
from google.appengine.ext.webapp import template 

register = template.create_template_register() 

@register.simple_tag 
def include_raw(path): 
    return loader.find_template(path)[0] 

đăng ký nó:

from google.appengine.ext.webapp import template 

template.register_template_library("tags") 

Sử dụng nó:

{% include_raw "this-will-be-included-verbatim.html" %} 
3

Nếu nguồn của bạn là HTML, giải pháp đơn giản nhất sẽ thay thế "{" và "}" bằng các thực thể HTML tương ứng của chúng:

{ trở thành {

} trở thành }

Ví dụ:

<code> 
To include some other file, you can use the &#123;% include %&#125; template tag. 
To include a variable, use &#123;%&#123;% varname &#125;%&#125;%. 
</code> 
14

Django 1,5 giải quyết vấn đề này với verbatim mẫu thẻ:

{% verbatim myblock %} 
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block. 
{% endverbatim myblock %} 
0

Dưới đây là một cách thanh lịch để giải quyết vấn đề cho Djan o 1.4. Nó là một thẻ tùy chỉnh Django. Đơn giản chỉ cần tạo một mô-đun verbatim_templatetag.py có chứa đoạn mã sau:

""" 
jQuery templates use constructs like: 

    {{if condition}} print something{{/if}} 

This, of course, completely screws up Django templates, 
because Django thinks {{ and }} mean something. 

Wrap {% verbatim %} and {% endverbatim %} around those 
blocks of jQuery templates and this will try its best 
to output the contents with no changes. 
""" 

from django import template 

register = template.Library() 


class VerbatimNode(template.Node): 

    def __init__(self, text): 
     self.text = text 

    def render(self, context): 
     return self.text 


@register.tag 
def verbatim(parser, token): 
    text = [] 
    while 1: 
     token = parser.tokens.pop(0) 
     if token.contents == 'endverbatim': 
      break 
     if token.token_type == template.TOKEN_VAR: 
      text.append('{{') 
     elif token.token_type == template.TOKEN_BLOCK: 
      text.append('{%') 
     text.append(token.contents) 
     if token.token_type == template.TOKEN_VAR: 
      text.append('}}') 
     elif token.token_type == template.TOKEN_BLOCK: 
      text.append('%}') 
    return VerbatimNode(''.join(text)) 

Sau đó, trong mẫu của bạn: {% tải verbatim_templatetag%}

Tất cả mọi thứ giữa {% nguyên văn%} và {% endverbatim%} sẽ không được phân tích.

Mã từ https://gist.github.com/ericflo/629508

Các vấn đề liên quan