重用django模板?

时间:2009-08-12 19:21:21

标签: django django-templates

我发现django的模板语言非常有限。随着django的DRY原则,我有一个模板,我想在许多其他模板中使用。例如患者名单:

    {% for physician in physicians.all %}
        {% if physician.service_patients.count %}
            <div id="tabs-{{ forloop.counter }}">
                {% include "hospitalists/patient_list.html" %}
            </div>
        {% endif %}
    {% endfor %}

问题是patient_list模板需要一个名为patients的患者列表。在包含模板之前,如何将physician.service_patients重命名为patients

谢谢, 皮特

3 个答案:

答案 0 :(得分:17)

使用with标签:

{% for physician in physicians.all %}
   {% if physician.service_patients.count %}
      {% with physician.service_patients as patients %}                   
         <div id="tabs-{{ forloop.counter }}">
            {% include "hospitalists/patient_list.html" %}
         </div>
      {% endwith %}
   {% endif %}
{% endfor %}

您也可以升级为创建自定义标记:

{% for physician in physicians.all %}
   {% if physician.service_patients.count %}
      {% patient-list physician.service_patients %}
   {% endif %}
{% endfor %}

尽管自定义标记涉及编写Python代码,但有一些快捷方式可以轻松地将现有模板文件用作标记:Django Inclusion Tags

答案 1 :(得分:3)

当你在循环中有“功能”(特别是if条件)时,你有机会将它移动到视图函数中。

<强>第一

此构造

{% for physician in physicians.all %}
    {% if physician.service_patients.count %}
    {% endif %}
{% endfor %}

很常见,你有几种方法可以避免它。

  1. 更改您的型号。如果service_patients.count`测试添加patients" method and use it instead of the default query set that you get with a on-to-many relationship. This method of your model has the,请将其从模板中删除。

    这消除了模板中的{%if%},将其减少到{%for%}和实际的HTML,这些都不容易被淘汰。

  2. 更改视图功能。编写几行代码来创建具有service_patients的医生列表,而不是简单的医生集合。您的视图函数中的此代码具有if service_patients.count测试,将其从模板中删除。

    这消除了模板中的{%if%},将其减少到{%for%}和实际的HTML,这是不容易消除的。

  3. 重点是摆脱{%if%},这样你就可以简单地剪切和粘贴{%for%}和实际的HTML。通过将模板保持为HTML(无法消除),唯一的开销是{%for%}

    <强>第二

    您似乎希望在稍微不同的上下文中重用{% include %}构造。

    这个{% include %}文件的问题根本不清楚。它“期待名为patients的患者名单”似乎表面上看起来很愚蠢。修复它,因此它需要physician.patients

    也许你想两次使用同一个清单。一次使用名为'patients'的列表,一次使用名为'physician.patients'的列表。在这种情况下,请考虑(a)简化或(b)编写模板标签。

    您似乎有一个患者列表,有时是一个独立的页面,而其他时间在一个更复杂的页面上重复多次。重复嵌入在某个较长列表中的详细信息列表并不是最好的页面设计。 Django对此没有帮助,因为 - 坦率地说 - 人们使用它并不容易。因此,选项(a) - 考虑重新设计这个“医生内的患者名单”列表过于复杂。

    但是,您始终可以编写模板标签来创建非常复杂的页面。

    <强>摘要

    Django模板语言功能有限的原因非常充分。您的所有功能应该是模型的基本功能,或者是使用该模型的当前应用程序的功能。

    表示只是将对象(和查询集)转换为HTML。没有更多

答案 2 :(得分:1)

顺便说一下,您可以尝试使用高质量的模板语言jinja。它更灵活。