Django模板缩进指南

Jam*_*Lin 14 django templates indentation

Python有PEP 8,但我还没有看到django模板的首选缩进指南.

我的意思是,我通常缩进这样的块:

<span>outside</span>
{% if condition %}
    <span>within condition</span>
{% endif %}
<span>outside</span>
Run Code Online (Sandbox Code Playgroud)

虽然这在编辑器上看起来不错,但它会在视图源上看起来像这样:

<span>outside</span>
  <span>within condition</span>
<span>outside</span>
Run Code Online (Sandbox Code Playgroud)

它甚至会在HTML缩进中看起来更糟糕,见下文:

<div>
    <span>outside</span>
    {% if condition %}
        <span>within condition</span>
    {% endif %}
</div>
Run Code Online (Sandbox Code Playgroud)

会变成:

<div>
    <span>outside</span>
        <span>within condition</span>
</div>
Run Code Online (Sandbox Code Playgroud)

虽然我同意在编辑器中更好的布局更重要,但我也对生成的凌乱的HTML源代码感到妄想.

Yeo*_*Yeo 5

我目前在 django 模板指南中遵循我自己的约定以确保一致性。规则很简单:

  1. Django 标签不会增加缩进级别
  2. HTML 标签确实增加了缩进级别

不管你有多少嵌套的 Django 标签,你都应该保持相同的缩进级别。我认为这是在模板中放置逻辑的权衡,如果可能的话应该尽量减少以避免混淆。

<html>
<body>
  <ul>
    {% if condition %}
    {% for item in menu_item %}
    <li>{{ item }}</li>
    {% endfor %}      
    {% endif %}
  </ul>
  <main>
    {% block content %}
    <p>Hello World</p>
    {% endblock content %}
  </main>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

边注

我使用 2 个空格作为 HTML 缩进,因为 HTML 往往有很深的嵌套。

对于 Vim 用户,请注意语法不是htmlbuthtmldjango

因此我~/.vimrc看起来像:

autocmd Filetype htmldjango setlocal ts=2 sts=2 sw=2 expandtab
Run Code Online (Sandbox Code Playgroud)

  • 不缩进 django 标签的一个问题是您无法直观地看到逻辑块,因为与查看页面源代码相比,这是我们 99.9% 的时间看到的。 (2认同)

Mat*_*ues 1

根据您的编辑器,有多种方法可以为 HTML 文件设置特定的缩进宽度。

\n\n

至于Django标签,不添加缩进级别实际上是一件好事。看那个例子:

\n\n
<ul>\n    {% for item in items %}\n        <li>{{\xc2\xa0item }}</li>\n    {% endfor %}\n</ul>\n
Run Code Online (Sandbox Code Playgroud)\n\n

会被渲染成这样:

\n\n
<ul>\n        <li>Bacon</li>\n        <li>Ninja</li>\n        <li>Tumbleweed</li>\n</ul>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们不希望有两级缩进。反而:

\n\n
{% block content %}\n<ul>\n    {% for item in items %}\n    <li>{{\xc2\xa0item }}</li>\n    {% endfor %}\n</ul>\n{% endblock content %}\n
Run Code Online (Sandbox Code Playgroud)\n