Tôi muốn tạo mã HTML và CSS có thể đọc được (được thụt lề chính xác) được xử lý trước bởi hệ thống mẫu Django cho ứng dụng độc lập của tôi.thụt lề thích hợp trong các mẫu Django (không có bản vá lỗi khỉ)?
Tôi đã sửa đổi phương thức hiển thị từ lớp NodeList được tìm thấy trong mô-đun django.template.base. Mã của tôi có vẻ hoạt động đúng cách, nhưng tôi đang sử dụng khỉ vá để thay thế phương thức hiển thị cũ.
Có cách nào thanh lịch hơn không sử dụng tính năng vá khỉ trong trường hợp này không? Hoặc có lẽ khỉ vá là cách tốt nhất ở đây?
Mã của tôi trông như thế này:
'''
This module monkey-patches Django template system to preserve
indentation when rendering templates.
'''
import re
from django.utils.encoding import force_text
from django.utils.safestring import mark_safe
from django.template.loader import render_to_string
from django.template import Node, NodeList, TextNode
from django.template.loader_tags import (BlockNode, ConstantIncludeNode,
IncludeNode)
NEWLINES = re.compile(r'(\r\n|\r|\n)')
INDENT = re.compile(r'(?:\r\n|\r|\n)([\ \t]+)')
def get_indent(text, i=0):
'''
Depending on value of `i`, returns first or last indent
(or any other if `i` is something other than 0 or -1)
found in `text`. Indent is any sequence of tabs or spaces
preceded by a newline.
'''
try:
return INDENT.findall(text)[i]
except IndexError:
pass
def reindent(self, context):
bits = ''
for node in self:
if isinstance(node, Node):
bit = self.render_node(node, context)
else:
bit = node
text = force_text(bit)
# Remove one indentation level
if isinstance(node, BlockNode):
if INDENT.match(text):
indent = get_indent(text)
text = re.sub(r'(\r\n|\r|\n)' + indent, r'\1', text)
# Add one indentation level
if isinstance(node, (BlockNode, ConstantIncludeNode, IncludeNode)):
text = text.strip()
if '\r' in text or '\n' in text:
indent = get_indent(bits, -1)
if indent:
text = NEWLINES.sub(r'\1' + indent, text)
bits += text
return mark_safe(bits)
# Monkey-patching Django class
NodeList.render = reindent
Tôi khá mới với django, bạn có thể cung cấp ví dụ về cách tôi có thể triển khai điều này trong dự án của mình không? –