重用django模板?

重用django模板?,django,django-templates,Django,Django Templates,我发现django的模板语言非常有限。遵循django的DRY原则,我有一个模板,我想在许多其他模板中使用。例如,患者列表: {% for physician in physicians.all %} {% if physician.service_patients.count %} <div id="tabs-{{ forloop.counter }}"> {% include "hospitalist

我发现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 %}
{%用于医师中的医师。所有%}
{%if内科医生.service_patients.count%}
{%include“hospitalists/patient_list.html”%}
{%endif%}
{%endfor%}
问题在于,患者列表模板需要一个名为
患者的患者列表。在包含模板之前,我如何将
内科医生服务患者
重命名为
患者

谢谢, Pete

当您在循环中具有“功能”(特别是if条件)时,您有机会将其移动到视图功能中

首先

这个构造

{% for physician in physicians.all %}
    {% if physician.service_patients.count %}
    {% endif %}
{% endfor %}
是如此普遍,你有几种方法来避免它

  • 改变你的模式。添加一个
    patients”方法并使用它,而不是通过on-to-many关系获得的默认查询集。模型的此方法具有
    if-service\u-patients.count`test,将其从模板中删除

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

  • 更改查看功能。编写几行代码以创建一个包含服务患者的医生列表,而不是简单的医生集合。查看功能中的此代码具有“如果服务患者。计数”
  • 测试,将其从模板中删除

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

    关键是要去掉{%if%},这样您就可以简单地剪切和粘贴{%for%}和实际的HTML了

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

    现在还不清楚这个
    {%include%}
    文件的问题是什么。它“期待一个名为
    患者的患者列表”
    “看起来似乎有点愚蠢。解决它,这样它就期待
    医生。患者

    也许你想两次使用同一个列表。一次使用一个名为<代码>患者的< <代码>,一次被称为<代码>医生。病人的。在这种情况下,考虑(a)简化或(b)写模板标签。

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

    但是,您始终可以编写模板标记来创建真正复杂的页面

    摘要

    Django模板语言的功能有限有一个很好的原因。您的所有功能都应该是模型的基本功能,或者是使用该模型的当前应用程序的功能


    演示只是将对象(和查询集)转换为HTML。除此之外,您可以尝试使用高质量的模板语言。它更灵活。

    使用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 %}
    

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

    S.Lott,我不确定这如何远程回答我关于重用模板的问题,该模板需要一个名为patients的对象。你能详细说明一下吗?S.Lott,感谢clarification。当与类似jQuery UI的选项卡式界面结合使用时,在更复杂的上下文中重复相同的模板变得非常有用。with标记是我问题的正确解决方案。在更复杂的上下文中重复相同的模板对用户有害。创建复杂标记以生成更复杂的UI对用户有害。添加任何形式的复杂性对用户都是有害的。S.Lott,恐怕你弄错了。重用模板对几乎所有的web开发人员都是必不可少的。django文档鼓励这样做。让我直说吧,你鼓励复制模板并修改它以获得不同的参数名称?我开始相信django的模板化gine的局限性太大了,应该扔掉它。谢谢!我一直在搜索“as”标记。我猜“with”也可以。从Django 1.3开始,您还可以使用以下样式:
    {%include“sometemplate.html”with spam=egs,ham=“ham!”%}
    {% for physician in physicians.all %}
       {% if physician.service_patients.count %}
          {% patient-list physician.service_patients %}
       {% endif %}
    {% endfor %}