Django模板继承

Django的模板继承类似于Python的类继承,用于提高效率。父模板包含重复代码,子模板继承并可重写父模板的特定部分。在父模板`base.html`中使用`block`标签,子模板通过`{% extends 'base.html' %}`指定继承,并能覆盖相同名称的`block`内容。子模板只继承内容,不继承上下文,需在相应`block`内添加视图中的上下文才能显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板继承:和Python中类的继承是相似的,典型应用是网站开头或者网站结尾。

父模板:如果一段代码重复出现,为了效率,通常会把这段代码定义到模板中,这个模板就是父模板。父模板定义在templates目录下。

子模板:需要继承父模板格式的模板,定义在templates/应用目录下。

模板继承中使用block标签,格式:

{% block 名称 %}
预留区域,可以编写默认内容,也可以没有默认内容
{% endblock 名称 %}
为了更好的可读性,建议block和endblock写上相同名称。

父模板代码:base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% block top %}
<h1>这是网页头部</h1>
{% endblock top%}

{% block content1 %}
<div>这是个牛逼的网站</div>
{% endblock content1%}

{% block content2 %}
{# 预留区域 #}
{% endblock content2%}

{% block bottom %}
<h1>这是网页尾部</h1>
{% endblock bottom%}
</body>
</html>

子模板:jicheng.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends 'base.html' %}

{% block top1 %}
<h1>呵呵呵呵呵呵</h1>
{% endblock top1%}
{% block content2 %}
<ul>
    {% for bookinfo in bookinfos %}
        <li>{{ bookinfo.name }}</li>
    {% endfor %}

</ul>
{% endblock content2%}
</body>
</html>

 结果:

这是网页头部

这是个牛逼的网站
射雕英雄传
天龙八部
笑傲江湖
雪山飞狐
这是网页尾部

 1.子模板需要继承父模板{% extends 'base.html' %}。

 2.子模板继承父模板之后,子模板原先的内容不显示,子模板里面的“呵呵呵呵”就没有显示。

也就是说子模板只能去修改父模板里的内容来自定义显示。

3.子模板可以重写名称相同的block模块,显示的是子模板重写之后的内容。

4.子模板会继承父模板的所有block模块,未重写的block模块都会显示。

5.父模板不会把上下文传给子模板,子模板只继承内容,不继承上下文。

6.如果在子模板的视图中加入了上下文,那么只有放到模块内才会显示。

视图:

def jicheng(request):
    bookinfos = BookInfo.objects.all()
    name = {'age':'18'}
    context = {
        'bookinfos': bookinfos,
        'name':name
    }
    return render(request, 'temp/jicheng.html', context)
 子模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends 'base.html' %}
{{ name.age }}


{% block top %}
<h1>呵呵呵呵呵呵{{ name.age }}</h1>
{% endblock top%}

{% block content2 %}
<ul>
    {% for bookinfo in bookinfos %}
        <li>{{ bookinfo.name }}</li>
    {% endfor %}

</ul>
{% endblock content2%}
</body>
</html>

 结果:

呵呵呵呵呵呵18

这是个牛逼的网站
射雕英雄传
天龙八部
笑傲江湖
雪山飞狐
这是网页尾部

总结:

请注意,我把子模板的top1模块名字改为了和父模板一样的top,等于重写了父模板的方法,name.age 一共写了两个地方,只有一个显示,其实这个和上面说到的一样,子模板自身的内容不会显示,但是如果需要显示子模板视图中的上下文,

就需要把属性写到和父模板block名称相同的模块里面。








 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值