Django模板缩进指南

时间:2013-08-27 03:43:55

标签: django templates indentation

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 个答案:

答案 0 :(得分:4)

我目前正在关于一致性问题的django模板指南中遵循我自己的约定。规则很简单:

  1. Django标记增加缩进级别
  2. HTML标记确定增加缩进级别
  3. 你有多少嵌套的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>
    

    旁注

      

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

         

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

         

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

    autocmd Filetype htmldjango setlocal ts=2 sts=2 sw=2 expandtab
    

答案 1 :(得分:0)

根据您的编辑器,有一些方法可以为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 %}

答案 2 :(得分: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,一个独立的缩进器和一个使用与网络模式相同的缩进规则的预提交钩子。

答案 3 :(得分: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 整理工具。就我而言,我尝试使用的工具损坏了模板,我需要手动执行该操作。