博客五部曲之一 - 简单博客


1394 浏览 5 years, 11 months

24 模板继承

版权声明: 转载请注明出处 http://www.codingsoho.com/

首先创建文件base.html,它将会是所有其他模板的父模板。

<!DOCTYPE html>
<html>
<head>
    <title>
        {% block head_title %}Blog Basic{% endblock %}
    </title>
    <style type="text/css">
        {% block style %}{% endblock %}
    </style>
</head>
<body>
    {% include "message_display.html" %}
    <div class="container">
        {% block content %}
        {% endblock content %}
    </div>
</body>
</html>

很重要的一个特性是block 标签,子模板继承父模板的所有内容,但是可以通过修改block的内容做相应的变化,但是整体结构基本不变。
我们在base.html添加block content,这个是最简单的内容块,是页面的主要内容所在,子模板可以通过重写这个block来实现自己的内容。
同时,在base模板,我们还添加了标题及样式相关的block,这些都会在子模板进一步实现。

更新post_form.html,首先用extends继承父模板内容,然后将form相关的内容移入content block内,写在block之外的内容是不会显示的。

{% extends "base.html" %}

{% block content %}
    <h1>Form</h1>
    <form method="POST" action="">{% csrf_token %}
        {{form.as_p}}
        <input type="submit" name="create post">
    </form>
{% endblock content %}

更新post_detail.html,另外我们进一步更新了另外两个block。在head_title block里,调用{{block.super}},它会同时获取父模板的内容,如果没有该语句,它直接替换父block。
通过继承实现style block,添加了css,注意在block之外添加了<style></style>,这个对页面显示并不起作为,写在这儿只是为了编辑器识别,方便语法高亮和自动代码完成。

{% extends "base.html" %}

{% block head_title %}{{instance.title}} | {{block.super}}{% endblock %}

<style type="text/css">
{% block style %}
h1{
    color: red;
}
{% endblock %}
</style>

{% block content %}
    <h1>{{instance}}</h1>
    {{instance.title}}<br>
    {{instance.id}}<br>
{% endblock content %}

重命名index.html到post_list.html,并修改为如下。别忘了修改view里的response的template名字。

{% extends "base.html" %}

{% block content %}
    {{ block.super }}
    <h1>{{title}} is working!</h1>
    {% for object in object_list %}
        <a href="{{ object.get_absolute_url }}">{{object.title}}</a><br>
        {{object.id}}<br>
    {% endfor %}
{% endblock content %}

最后,介绍一个include tag,它可以直接引入另外一个html文件,本例中将message内容单独写成message_display.html,并在base.html里面通过include加入到页面。