19

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

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

<span>outside</span>
{% if condition %}
    <span>within condition</span>
{% endif %}
<span>outside</span>

虽然这在编辑器上看起来不错,但在查看源代码上看起来很糟糕,如下所示:

<span>outside</span>
  <span>within condition</span>
<span>outside</span>

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

<div>
    <span>outside</span>
    {% if condition %}
        <span>within condition</span>
    {% endif %}
</div>

会变成:

<div>
    <span>outside</span>
        <span>within condition</span>
</div>

虽然我同意在编辑器中拥有更好的布局更为重要,但我也对生成的凌乱的 HTML 源代码感到偏执。

4

4 回答 4

6

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

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

不管你有多少嵌套的 Django Tag,你应该仍然在同一级别的缩进。我认为这是将逻辑放入模板中的权衡,如果可能的话,应该尽量减少模板以避免混淆。

<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>

边注

我为 HTML 缩进使用了 2 个空格,因为 HTML 往往有一个非常深的嵌套。

对于 Vim 用户,请注意语法不是html但是htmldjango

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

autocmd Filetype htmldjango setlocal ts=2 sts=2 sw=2 expandtab
于 2015-06-24T19:06:44.723 回答
1

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

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

<ul>
    {% for item in items %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>

会像这样呈现:

<ul>
        <li>Bacon</li>
        <li>Ninja</li>
        <li>Tumbleweed</li>
</ul>

而且我们不想要两个级别的缩进。反而:

{% block content %}
<ul>
    {% for item in items %}
    <li>{{ item }}</li>
    {% endfor %}
</ul>
{% endblock content %}
于 2013-08-27T08:17:40.453 回答
0

我认为这更多是个人喜好,并且将来易于阅读和易于理解的内容(我的时间限制是“六个月后”)将比某些食谱食谱更好。我使用的是两种类型的方法,不仅适用于 Django 模板,而且适用于任何接受代码自由格式的语言。因此,我将非关键部分格式化为仅左对齐的行块,这无疑是令人眼花缭乱的,但我倾向于忽略它们,因此我可以专注于广泛缩进的重要部分,通常最好是每行单个动作并在每个语义处缩进组更改,因此所有父/子分组、嵌套元素等只需一看就可见。

{% if error_message %} 
<p>
<strong>{{error_message}}</strong>
</p>
{% else %}

<table border>
    <tr>
        <td>
            {{degerlendirme.adi}}
        </td>
    </tr>
    <tr>
        <td>
            <table border>
                <tr>
                    <td>
                        Tip
                    </td>
                    <td>
                        {{ tip }}
                    </td>
                </tr>
                <tr>
                    <td>
                        Açıklama
                        
                    </td>
                    <td>
                        {{ degerlendirme.aciklama }}
                    </td>
                </tr>
            </table>
        </td>
    </tr>
    <tr>
        <td>
            <form action="{% url 'perf:degerlendirme' degerlendirme.id %}" method="post">
                {% csrf_token %}
                {{ form }}
                <input type="submit" value="OK" />
            </form>
        </td>
    </tr>
</table>
{% endif %}

我通常使用 Eclipse,有几个很好的 HTML 编辑工具可以安装到那个环境中。我尝试使用它们,但更喜欢仅仅依靠缩进来简化阅读/编码/分析周期。那主要是因为我经常需要使用其他编辑器,主要是vi。在这种情况下,如果我主要依赖 Eclipse 或我使用的任何 IDE 来理解代码 vi、nano 或其他文本编辑器,我的生活就会变得悲惨。
正如我的一位教授在课堂上所说,很多年前,空间是免费的,标签甚至更便宜。
最后一点;曾经我需要从创建大量嵌套表的 Django 模板中删除所有空白以提高运行时性能。在某些情况下可能需要这样。在类似情况下,最好保留一个工作副本并通过脚本或工具从中生成运行时副本。我知道,有一些 HTML 整理工具。就我而言,我尝试使用的工具损坏了模板,我需要手动执行该操作。

于 2021-05-24T18:11:17.160 回答
0

我很抱歉再次提出一个老问题,但我认为 Emacs 的web-mode.el缩进 Django 模板的方式值得在这里提及:

{% block content %}
    <div
        id="1"
        class="fancy"
    >
        {% if link %}
            <a href="{{ link }}">
                Click here
            </a>
        {% endif %}
    </div>
{% endblock %}

如您所见,它缩进了 Django 标记和 HTML 标记,以及多行 HTML 标记。它也支持<style><script>标记。事实上,我非常喜欢这种行为,以至于我创建了DjHTML,一个独立的缩进器和一个使用与 web 模式相同的缩进规则的预提交钩子。

于 2021-05-24T17:40:09.293 回答