模板继承

做过web station的朋友应该知道,网页中常会有大量的冗余代码。

比较传统的方法是把相同的代码单独写在一起。

然后在用include加载到实际的页面中。

django中{% include %}就起到这个作用,不过通常情况下并不这样用


更有效的方法是使用模板继承,简单来说,需要先写一个包含所有共用代码的模板作为父模板,然后实际的网页继承父模板,并体现其不同的地方。

这里是父模板,base.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My helpful timestamp site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>

在父模板中<% block *** %><% endblock %>之间的内容是子模板中可以编辑的部分,而在父模板的内容是默认设置,其他部分是共用代码。


实际页面,current_date.html

{% extends "base.html" %}

{% block title %}The current time{% endblock %}

{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}
{% block footer %}
    {{ block.super }}
    <p> Thanks </p>
{% endblock %}

<% extends %>指名要继承的父模板。

{{ block.super }}代表父模板中的默认设置,常在追加编辑时使用。


然后,是相应的视图函数date,在views.py中

from django.http import HttpResponse
from django.shortcuts import render_to_response
import datetime

def hello(request):
    return HttpResponse("hello world")

def showtime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now "+str(now)+"</body></html>"
    return HttpResponse(html)


def letter(request):
    name = "wangxb"
    company = "kuxun"
    date = datetime.datetime.now()
    item = ["abcd","dbdkj"]
    ordered_warranty = True
    return render_to_response('letter.html',{
        'person_name':name,
        'company':company,
        'ship_date':date,
        'item_list':item,
        'ordered_warranty':ordered_warranty})

def time(request):
    time = datetime.datetime.now()
    return render_to_response('time.html',locals())

def date(request):
    current_date = datetime.datetime.now()
    return render_to_response('current_date.html',locals())


最后,设置映射,urls.py

from django.conf.urls import patterns, include, url
from mysite.views import hello,showtime,letter,time,date
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # url(r'^admin/', include(admin.site.urls)),
    ('^hello/$',hello),
    ('^time/$',showtime),
    ('^letter',letter),
    ('^_time',time),
    ('^date',date),
)

添加最后的date内容就可以了


以上就是模板继承的方法了

里面包含了之前文章中的代码,并不是全部有用的,如果感觉看不懂的话,建议看下前面的文章,了解下django的工作原理。

### Django 模板继承使用方法 #### 基础概念 Django模板继承允许创建一个基础模板,其他页面可以基于这个基础模板来构建。这不仅减少了重复代码的数量,还使得维护更加容易[^1]。 #### 关键标签解释 实现模板继承主要依赖于两个核心标签:`{% extends %}` 和 `{% block %}`。其中,`extends`用于指定当前模板继承的基础模板;而`block`则定义了可以在子模板中被覆盖的内容区域[^3]。 #### 实际操作案例 ##### 创建基础模板 `base.html` ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}默认标题{% endblock %}</title> </head> <body> <header> <!-- 头部导航栏 --> 导航菜单... </header> <main> {% block content %} 这里是主体内容,默认显示此消息。 {% endblock %} </main> <footer> <!-- 底部版权信息 --> 版权声明... </footer> </body> </html> ``` 在这个例子中,通过设置不同的`block`部分,可以让各个具体的页面拥有独特的头部、主要内容区以及页脚等内容,同时保持整体布局的一致性[^2]。 ##### 子模板实例 `child_page.html` ```html {% extends "base.html" %} {% block title %} 自定义页面标题 - 子页面 {% endblock %} {% block content %} <h1>欢迎来到我的个人博客</h1> <p>这里是关于编程学习的文章列表...</p> {# 可以继续添加更多HTML结构 #} {% endblock %} ``` 当访问该子页面时,浏览器会先加载`base.html`中的框架结构,再用`child_page.html`里的具体内容替换掉相应位置上的占位符文字,从而形成完整的网页文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值