Pageparts扩展模板

时间:2011-08-22 14:30:27

标签: django django-templates

假设我想在我的网站上重复一些简单的HTML结构。 例如,我想在“绿色框”中显示页面的某些部分。

实现此目标的第一个必要步骤是创建如下模板文件:

<!-- greenbox.html -->
<div style="background-color:#88ff88;"><br>
{% block content %}<br>
{% endblock %}<br>
</div>

然后每当我需要这个预定义模板时,我必须创建一个单独的模板,如下所示:

<!-- pagepart_1.html -->
{% extends "greenbox.html" %}
{% block content %}
This time I want to add this dummy text in here
{% endblock %}

<!-- pagepart_2.html -->
{% extends "greenbox.html" %}
{% block content %}
The second time I want to add some other text
{% endblock %}

包含绿色框的实际页面如下所示:

<html><head>My Page</head>
<body>
<h1>Page Title</h1>
{% include "pagepart_1.html" %}
<br /><br />
{% include "pagepart_2.html" %}
</body></html>

这种方法确实有效,但我认为它包含一些开销。 我可以避免为每个实例(pagepart_1.html,pagepart_2.html,...)创建单独的模板吗?

那么我可以让我的主页看起来像这样吗?

<html><head>My Page</head>
<body>
<h1>Page Title</h1>
{% unkowntag extend "greenbox.html" %}
{% block content %}
This time I want to add this dummy text in here
{% endblock %}
{% endunknowntag %}
<br /><br />
{% unkowntag extend "greenbox.html" %}
{% block content %}
The second time I want to add some other text
{% endblock %}
{% endunknowntag %}
</body></html>

非常感谢!

2 个答案:

答案 0 :(得分:0)

这是您希望允许完全自定义内容区域的唯一可用方法。但是,如果您可以标准化内容,以便它始终显示无序列表,例如,您可以执行以下操作:

<!-- greenbox.html -->
<div style="background-color:#88ff88;"><br>
    <ul>
        {% for item in list %}
        <li>{{ item }}</li>
        {% endfor %}
    </ul>
</div>

然后在你的模板中:

<!-- mypage.html -->
{% with something as list %}
   {% include 'greenbox.html' %}
{% endwith %}

你可以做更复杂的结构甚至传递多个变量(在Django 1.3 +中):

<!-- greenbox.html -->
<div style="background-color:#88ff88;"><br>
    <h2>{{ title }}</h2>
    <img style="float:{{ float }};" src="{{ image }}" alt="{{ alt_text }}">
    <p>{{ description }}</p>
</div>

<!-- mypage.html -->
{% with title=obj.title image=obj.image.name alt_text=obj.title float="left" description=obj.description %}
   {% include 'greenbox.html' %}
{% endwith %}

答案 1 :(得分:0)

我会编写一个自定义标记,它会发出HTML并多次使用它。