2009-07-24 62 views
15
<html> 
    <head> 
     <title>{% block title %}{% endblock %}</title> 
    </head> 

    <body> 
     <h1>{% block title %}{% endblock %}</h1> 
    </body> 
</html> 

这是我的模板,或多或少。 h1标题始终与标题标签相同。以上代码片段无效,因为不能有两个具有相同名称的块。我如何处理这个问题而不重复自己?在django模板中复制数据的最佳方式是什么?


编辑澄清:我有一吨重的子模板,从这个一个模板继承,因此使得新的{{title}}变量为每个模板并不是一个很好的解决方案。以前我有它成立这样的:

base.html文件:

<title>{% block title %}{% endblock %}</title> 

然后base_view.html(扩展base.html文件):

<h1>{% block title %}{% endblock %}</h1> 

然后base_object.html(扩大base_view.html):

{% block title %}my title goes here{% endblock %} 

它只是以某种方式工作。我重构了我的模板,因此只有base.html和base_object.html如何获得此功能?

回答

8

它看起来像你的布局是坚实的。您有一个base.html模板,用于定义应用中每个页面的基本结构和外部布局。您还有扩展此模板的base_object.html

你希望每个页面都有一个唯一的标题和匹配的h1(我认为)。这样做的最好方法是在base.html模板中定义两个独立的块。

<html> 
    <head> 
     <title>{% block title %}Default Title{% endblock %}</title> 
    </head> 

    <body> 
     <h1>{% block h1 %}{% endblock %}</h1> 
    </body> 
</html> 

在您的子模板中,如果您希望它们相同,则需要覆盖这两个模板。我知道你觉得这是违反直觉的,但是由于在Django中处理模板继承的方式,这是非常必要的。

来源:The Django template language

最后要注意,你不能定义多个{% block %}标签在同一个模板相同的名称。这种限制的存在是因为块标签在“两个”方向上工作。也就是说,块标签不仅提供了一个要填充的洞 - 它还定义填充父项中的洞的内容。如果在模板中有两个名称相似的{% block %}标记,则该模板的父级将不知道要使用哪个块的内容。

的孩子是这样的:

{% extends "base.html" %} 
{% block title %}Title{% endblock %} 
{% block h1 %}Title{% endblock %} 

如果这困扰你,你应该从每一个对象作为模板变量视图设置标题。

{% block title %}{{ title }}{% endblock %} 
{% block h1 %}{{ title }}{% endblock %} 

Django努力保持模板层尽可能多的逻辑。通常标题是从数据库动态确定的,所以视图层是检索和设置这些信息的理想场所。您仍然可以留下标题空白,如果你想推迟到默认标题(也许在base.html设置,或者可以从django.contrib.sites包抢站点的名称)

而且{{ block.super }}可能会派上用场。这将允许您将父块的内容与孩子的其他内容组合在一起。所以,你可以在孩子这样定义的基础“Stackoverflow.com”标题,并设置

{% block title %}{{ block.super }} - Ask a Question{% endblock %} 

得到象一本名为“Stackoverflow.com - 提问”

1

将一个变量传递给您的模板,也许称为标题。然后用{{title}}替换您的标题栏。通入在您看来您的模板此请确保您有:

def myview(request): 
    t = loader.get_template("mypage.html") 
    title = "My Title" 
    c = Context({"title" : title }) 
    HttpResponse(t.render(c)) 

然后在你的模板,你将有:

<html> 
<head> 
    <title>{{ title }}</title> 
</head> 

<body> 
    <h1>{{ title }}}</h1> 
</body> 

参见:How to repeat a "block" in a django template

+0

这不是应该如何使用Django。 – 2009-07-24 16:57:13

+0

@Frank Crook:小心解释? – 2009-07-24 17:00:57

8
{% extends "base.html" %} 

{% with "Entry Title" as title %} 
    {% block title %}{{ title }}{% endblock %} 
    {% block h1 %}{{ title }}{% endblock %} 
{% endwith %} 

那可以工作,如果你真的担心保持title的意见,而不是重复自己。

20

在base.html文件:

<head> 
    <title>{% block title %}{% endblock %}</title> 
</head> 

<body> 
    <h1>{% block h1 %}{% endblock %}</h1> 
</body> 

然后,就那个叫content_base.html的顶部(或东西)另一个 “基地” 层:

{% extends "base.html" %} 

{% block h1 %}{% block title %}{% endblock %}{% endblock %} 

现在有你的所有其他模板扩展content_base.html。无论您在所有模板中放入“标题”,都会在base.html中的“标题”和“h1”块中放入。

相关问题