Rez*_*nor 12 django extends include
我和我的朋友正在争吵.在我目前的Django项目中,我创建了一个名为menu.html的文件,该文件将包含一系列配置并格式化为列表的链接.我现在使用以下Django/Python代码包含菜单,而不是手动将菜单硬编码到每个页面中:
{% include 'menu.html' %}
Run Code Online (Sandbox Code Playgroud)
但是,我的朋友建议这是不正确的方法.他说我需要使用extends而不是include然后定义内容,如下所示:
{% extend 'menu.html' %}
{% block content %}
The rest of my content here.
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
这是一些额外的代码.我使用哪个真的很重要?我更愿意使用前者.
Pet*_*ell 13
是的,这很重要.首先,extends只能作为文件的第一行出现.其次,include在解析堆栈上推送和弹出上下文对象,这意味着在include中的上下文中创建的值在返回时将超出范围.
我的规则是:创建base.html模板文件,定义站点的整体结构,并使用{% block foo %}关键区域周围的自由量.然后将所有其他模板extends作为基础(或者自身扩展基础的东西),并根据需要替换这些块.
include另一方面,它适用于封装您可能需要在多个地方使用的东西,甚至可能在同一页面上.
更新:
我一直在使用我自己的库,template_tags以至于我忘记了Django的模板语言在功能上仍然存在重大差距.这里讨论的标签来自早期的django片段expr,我已经对其进行了大量编辑和扩展.例如,您可以说{% expr 'Fred' as name %}(或任何有效的Python表达式),它会将结果存储在当前Context中的"name"插槽中.如果在included模板中发生这种情况,name则在退出模板文件时将弹出值.
你可以使用{% with %}标签来实现这一点,但是expr给了我更大的灵活性,包括进行任意复杂的调用.最初出现这种情况时,必须创建复杂的缓存对象,这些对象需要在视图中无法完成的昂贵的DBMS交互,因此必须在模板本身中调用它们.
如果您需要深入了解,请给我发电子邮件(在我的个人资料中).
| 归档时间: |
|
| 查看次数: |
8024 次 |
| 最近记录: |