我正在渲染一个包含大量嵌套循环和if语句的Django模板。这导致模板输出大约30 000行。显然我需要删除那些空行!
我试过了:
{% spaceless %}
{% endspaceless %}
然而,如果'使用它,我会遇到错误。介于两者之间的陈述:
第447行的无效广告代码:'无空格',预期' elif''其他' 或者' endif'。您是否忘记注册或加载此标记?
我也尝试过:
outputStr = str(result._container[0],'utf-8')
outputStr2 = re.sub(r'^$\n', '', outputStr, flags=re.MULTILINE)
结果是HttpResponse对象。但是,空行不会被删除,我不确定如何将字符串转换回字节。
然后存在使用中间件的选项,例如这篇文章建议:
How to remove spaces and empty lines from HTML in Django?
这对我来说似乎有点危险。所以我想避免这种情况。
任何帮助将不胜感激!
答案 0 :(得分:3)
尝试使用django-htmlmin
pip install django-htmlmin
单个视图
使用装饰器 django-htmlmin还提供了一个装饰器,你只能在想要缩小响应的视图上使用它:
from htmlmin.decorators import minified_response
@minified_response
def home(request):
return render_to_response('home.html')
所有项目
使用中间件 您需要做的就是将两个中间件添加到MIDDLEWARE_CLASSES并启用HTML_MINIFY设置:
MIDDLEWARE_CLASSES = (
# other middleware classes
'htmlmin.middleware.HtmlMinifyMiddleware',
'htmlmin.middleware.MarkRequestMiddleware',
)
请注意,如果您使用Django的缓存中间件,MarkRequestMiddleware应该使用FetchFromCacheMiddleware,而HtmlMinifyMiddleware应该使用UpdateCacheMiddleware:
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
'htmlmin.middleware.HtmlMinifyMiddleware',
# other middleware classes
'django.middleware.cache.FetchFromCacheMiddleware',
'htmlmin.middleware.MarkRequestMiddleware',
)
您可以选择指定HTML_MINIFY设置:
HTML_MINIFY = True
HTML_MINIFY设置的默认值不是DEBUG。如果要在启用DEBUG时缩小HTML代码,则只需将其设置为True。
答案 1 :(得分:2)
我使用自定义模板标记选择不同的名称,lineless
只是一个名称。
它只删除空行,带有空格或Python strip()
检测到的任何字符的行作为空格。
templatetags/custom_filters.py
from django.template import Library,Node
register = Library()
@register.tag
def lineless(parser, token):
nodelist = parser.parse(('endlineless',))
parser.delete_first_token()
return LinelessNode(nodelist)
class LinelessNode(Node):
def __init__(self, nodelist):
self.nodelist = nodelist
def render(self, context):
input_str = self.nodelist.render(context)
output_str = ''
for line in input_str.splitlines():
if line.strip():
output_str = '\n'.join((output_str, line))
return output_str
<!DOCTYPE html>{% load custom_filters %}{% lineless %}
...
</html>{% endlineless %}