如何格式化Django模板,而不会在输出中使用格式化空格?

7nbnzgx9  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(121)

我需要生成一些txt文件,用于Django模板的Jinja2会导致模板代码看起来非常混乱,因为我不能在生成的结果中不使用换行符。{% spaceless %}标记可能会使事情变得更加混乱,因为很难插入所需的空间。
举个例子:

[{% if foo.condition %}x{% else %} {% endif %}] List of requirements fulfilled: {{ foo.requirements_fullfilled }} of {{ foo.num_requirements }} {% for requirement in foo.requirement %}
- {{ requirement.number }}{% if requirement.name %}: {{ solution.exercise.name }}{% endif %}{% endfor %}

请注意-之前的换行符,这使得列表在每个项目符号之前添加一个换行符,并为所有其他标记添加缺少的换行符,因为它们在输出中可见。
使用无空格可以设置格式,但也可以删除项目符号点之前的换行符。没有spaceless,线条看起来很乱。我还尝试在注解中使用{# #}和换行符作为变通方法,但是多行注解需要使用{% comment %}模板标签,它本身有一个非常冗长的名称,结果是,例如:

[{% if foo.condition %}{% comment %}
    {% endcomment %}x{% comment %}
{% endcomment %}{% else %}{% comment %}
    {% endcomment %} {% comment %}{# Attention: Here is a space character between the comment tags! #}
{% endcomment %}{% endif %}]

这只是生成空间或x的部分。当然,我可以在这里写一个“xiftrue”过滤器,但这对剩下的长行没有帮助。

mklgxw1f

mklgxw1f1#

将逻辑从模板移到Python视图中。使用基于类的视图,您可以执行以下操作:

def get_context_data( self, **kwargs):
    context = super().get_context_data( **kwargs)

    context['foocon'] = "x" if foo.condition else " "

    req_texts = []
    for requirement in foo.requirement:

        name = f": {solution.exercise.name}" if requirement.name else ""
        req_texts.append(
            f"- {requirement.number}{name}" )

    context['req_text'] = '\n'.join(req_texts)
    return context

然后模板就变成了

[{{foocon}}] List of requirements fulfilled: {{ foo.requirements_fullfilled }} of {{ foo.num_requirements }} 
{{req_text}}

或者你可以在Python中做更多的工作,简单地用一个变量替换模板中的任何逻辑。
根据模板的其余部分和需求,我可能完全不需要呈现,而只是构建一组文本行作为Python字符串列表,然后将其作为文本响应返回

filename = "some-filename.txt"
response = HttpResponse(
      '\n'.join( list_of_lines), 
       content_type='text/plain'
)
response['Content-Disposition'] = f'attachment; filename={filename}'
return response

相关问题