Đố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
Trả lời
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.)
+1 cho "như là một hack kludgy". –
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ó. –
Tôi thích ý tưởng "'[' và trao đổi với JS" của bạn tốt hơn. – lawrence
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.
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" %}
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 {% include %} template tag.
To include a variable, use {%{% varname }%}%.
</code>
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 %}
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.
- 1. Đặt biến "này" dễ dàng?
- 2. Làm cách nào để sử dụng Python để dễ dàng mở rộng các biến thành chuỗi?
- 3. Có cách nào dễ dàng để biến đầu vào biểu mẫu Java/Spring trống thành các chuỗi rỗng không?
- 4. Một cách khác thay vì thoát khỏi các mẫu regex?
- 5. Làm cách nào để thoát khỏi các ký tự đặc biệt của LaTeX bên trong các mẫu django?
- 6. Cách dễ dàng để sử dụng FindControl ("")
- 7. Có cách nào dễ dàng hơn để hợp nhất các Biểu mẫu Windows.
- 8. Có cách nào dễ dàng để tạo các biến động với Javascript?
- 9. Có cách nào dễ dàng để tự động hoàn thành các biến khối trong xcode?
- 10. Cách dễ dàng để sắp xếp lại các cột?
- 11. Cách dễ dàng để xem các tệp kết xuất postgresql?
- 12. Làm cách nào tôi có thể dễ dàng xóa dấu phẩy cuối cùng khỏi mảng?
- 13. Làm thế nào để thoát khỏi các thẻ mẫu chất lỏng?
- 14. Có cách nào dễ dàng để tách HTML khỏi QString trong Qt không?
- 15. Cách dễ dàng để phá vỡ chương trình VB.NET
- 16. Cách dễ dàng để chạy "giải thích" trên bộ truy vấn trong django
- 17. Làm cách nào để thoát khỏi các dấu ngoặc nhọn bên trong các mẫu ngọc bích?
- 18. Dễ dàng viết các Gói trong Cocoa
- 19. Cách dễ dàng để làm mới ListBox trong WPF?
- 20. Cách dễ dàng để "thêm" hai bảng lớn vào R?
- 21. Django: Gán các biến trong mẫu
- 22. Có cách nào dễ dàng để xóa biểu mẫu ASP.NET không?
- 23. Cách thoát khỏi Cfoutput
- 24. Làm thế nào để bạn chia sẻ các biến với các hoạt động khác một cách dễ dàng?
- 25. Có cách nào dễ dàng để biến một bảng MySQL thành một Redis tương đương?
- 26. Cách dễ dàng để kiểm tra xem một biến được định nghĩa trong python?
- 27. Hủy libcurl dễ dàng xử lý
- 28. Làm cách nào để thêm các đối tượng CGPoint vào NSArray một cách dễ dàng?
- 29. Erlang - Interleave một cách dễ dàng
- 30. increment một biến trong các mẫu django
+1 - Câu hỏi hay. Tôi cũng muốn biết câu trả lời. – sberry