13

我的朋友和我有一个小争论。在我当前的 Django 项目中,我创建了一个名为 menu.html 的文件,该文件将包含一堆配置并格式化为列表的链接。我目前没有将菜单手动硬编码到每个页面中,而是使用以下 Django/Python 代码包含菜单:

{% include 'menu.html' %}

但是,我的朋友建议这是不正确的方法。他说我需要使用扩展而不是包含,然后定义内容,如下所示:

{% extend 'menu.html' %}
{% block content %}
The rest of my content here.
{% endblock %}

这是一些额外的代码。我使用哪个真的很重要吗?我更喜欢使用前者。

4

3 回答 3

14

是的,这很重要。首先extends只能作为文件的第一行出现。其次,include在解析堆栈上推送和弹出上下文对象,这意味着在包含时在上下文中创建的值将在返回时超出范围。

我的规则是:创建base.html定义站点整体结构的模板文件,并{% block foo %}在关键区域周围大量使用。然后将所有其他模板extends作为基础(或本身扩展基础的东西),并根据需要替换这些块。

include另一方面,它有利于封装您可能需要在多个地方使用的东西,甚至可能在同一页面上。

更新:

我一直在使用自己的库,template_tags以至于我忘记了 Django 的模板语言在功能上仍然存在重大差距。这里有问题的标签来自一个早期的 django 片段expr,我已经对其进行了大量编辑和扩展。例如,您可以说{% expr 'Fred' as name %}(或任何有效的 Python 表达式),它会将结果存储在当前 Context的“名称”槽中。如果这发生在included模板中,name的值将在模板文件退出时弹出。

{% with %}您可以使用标签来实现这一点,但expr给了我更大的灵活性,包括进行任意复杂的调用。这最初是在必须创建复杂的缓存对象时出现的,这些对象需要昂贵的 DBMS 交互,而这些交互无法在视图中完成,它们必须在模板本身中调用。

如果您需要更深入地了解这一点,请给我发电子邮件(在我的个人资料中)。

于 2010-02-24T01:31:33.353 回答
3

( 他的朋友 )

我的真正意思是定义一个base.html,这样你就可以继承一个与几个通用部分一致的基本模板,这个包括 doctype,html 元素定义了 3 个块用于内容和导航以及可选区域以覆盖/插入头部中的脚本/链接元素。

<!doctype>
<html>
<head>
{%block extrahead %} {%endblock %}
</head>
{%block nav %}
<nav>
  <ul>
    <li>home</li>
  </ul>
</nav>
<div id="content">
{% endblock %}
{%block content %}
{% endblock %}
</div>
</html>

然后你可以定义homepage.html

{% extends "base.html" %}

{% block content %}
homepage content
{% endblock %}

homepage.html然后会有导航,因为它扩展了base.html.

于 2010-02-24T01:32:13.620 回答
2

在这种情况下,将菜单放入其中base.html并从中扩展似乎更有意义。

including非常适合拆分复杂的模板并重用这些块。

假设您在站点的不同位置使用相同的列表样式,但您向它发送了其他查询集。只要你调用querysets一样,你只需要编写一次模板代码。

在这里,我对普通请求和 ajax 请求使用不同的模板。但是使用 include 让我可以重用两个模板中的大部分内容

于 2010-02-24T07:18:23.620 回答