我发现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
?
谢谢, 皮特
答案 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 %}
很常见,你有几种方法可以避免它。
更改您的型号。如果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,这些都不容易被淘汰。
更改视图功能。编写几行代码来创建具有service_patients的医生列表,而不是简单的医生集合。您的视图函数中的此代码具有if service_patients.count
测试,将其从模板中删除。
这消除了模板中的{%if%},将其减少到{%for%}和实际的HTML,这是不容易消除的。
重点是摆脱{%if%},这样你就可以简单地剪切和粘贴{%for%}和实际的HTML。通过将模板保持为HTML(无法消除),唯一的开销是{%for%}
<强>第二强>
您似乎希望在稍微不同的上下文中重用{% include %}
构造。
这个{% include %}
文件的问题根本不清楚。它“期待名为patients
的患者名单”似乎表面上看起来很愚蠢。修复它,因此它需要physician.patients
。
也许你想两次使用同一个清单。一次使用名为'patients'
的列表,一次使用名为'physician.patients'
的列表。在这种情况下,请考虑(a)简化或(b)编写模板标签。
您似乎有一个患者列表,有时是一个独立的页面,而其他时间在一个更复杂的页面上重复多次。重复嵌入在某个较长列表中的详细信息列表并不是最好的页面设计。 Django对此没有帮助,因为 - 坦率地说 - 人们使用它并不容易。因此,选项(a) - 考虑重新设计这个“医生内的患者名单”列表过于复杂。
但是,您始终可以编写模板标签来创建非常复杂的页面。
<强>摘要强>
Django模板语言功能有限的原因非常充分。您的所有功能应该是模型的基本功能,或者是使用该模型的当前应用程序的功能。
表示只是将对象(和查询集)转换为HTML。没有更多
答案 2 :(得分:1)
顺便说一下,您可以尝试使用高质量的模板语言jinja。它更灵活。