1.模板继承
在HTML里,我们经常会重复使用一个HTML页面的框架,然后在复制里面的代码,在粘贴到其他的页面里,这样既费力又费时,所以可以通过下面的方法,来改善这个问题,那么这个方法是什么呢?就是模板继承啦!
模板继承是3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层。模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义的区块进行重载。
因此,模板继承的优势其实是设计基础模板中的区块(block)和子模板中替换这些区块。每个区块由<block></block>标签组成,并且不支持block标签的嵌套。那我们来简单的举例一下吧!
模板的父类
father.html
{% block title %} {% endblock %} #子类将会在{% block title %} {% endblock %}这里面填写子类网页的标题内容 {% block css %} {% endblock %} #子类将会在 {% block css %} {% endblock %}这里面填写子类网页的样式模板之继承
模板的子类
son1.html
{% extends 'father.html' %} #告知继承的是master.html{% block title %}模板之继承{% endblock %} #替换父类模板的{% block title %}{% endblock %}添加标题内容{% block css %} #替换父类模板的{% block css %}{% endblock %}添加样式 {% endblock %}
到此为止,这就是模板的继承
2.模板导入
承接上文,既然模板继承已经知道,那么模板导入也变得很轻松
模板导入,什么是模板导入呢?我先举个例子吧,假如你在做一个项目,但是这个项目的所有.html文件中都要有一个div的模态框,然而,为了实现这个功能你不得不在每个html文件中重复写他,既耗力又费时,所以可以通过模板导入来完成这项工作,利用模板导入,可以用简短的语句条令,来完成很多重复复杂的任务!这就是它的便捷之处!
首先先创建一个模板,为了通俗易懂,没做那么多的修饰
tag.html
son1.html
{% extends 'father.html' %}{% block titel %}子类{% endblock %}{% block css %}{% endblock %}{% block content %}{% include 'tag.html' %} #导入之前创建的模板,可以在这个页面中显示tag.html的所创建的样式{% endblock %}{% for u in user_list %}
- { { u }}
{% endfor %}
3.模板的执行
模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。
def current_datetime(request): now = datetime.datetime.now() html = "It is now %s." % now return HttpResponse(html)
from django import templatet = template.Template('My name is { { name }}.')c = template.Context({ 'name': 'Adrian'})print t.render(c)
import datetimefrom django import templateimport DjangoDemo.settings now = datetime.datetime.now()fp = open(settings.BASE_DIR+'/templates/Home/Index.html')t = template.Template(fp.read())fp.close()html = t.render(template.Context({ 'current_date': now}))return HttpResponse(html
from django.template.loader import get_templatefrom django.template import Contextfrom django.http import HttpResponseimport datetime def current_datetime(request): now = datetime.datetime.now() t = get_template('current_datetime.html') html = t.render(Context({ 'current_date': now})) return HttpResponse(html)
return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))
4.模板语言
模板中也有自己的语言,该语言可以实现数据展示
·{
{ item }}·{% for item in item_list %} <a>{ { item }}</a> {% endfor %} forloop.counter forloop.first forloop.last ·{% if ordered_warranty %} {% else %} {% endif %}·母板:{% block title %}{% endblock %} 子板:{% extends "base.html" %} {% block title %}{% endblock %}·帮助方法: { { item.event_start|date:"Y-m-d H:i:s"}} { { bio|truncatewords:"30" }} { { my_list|first|upper }} { { name|lower }}5.自定义simple_tag
a、首先在app中创建templatetags模块(模块名字一定是templatetags)
b、然后在templatetags里创建任意 .py 文件,如:xx.py
from django import templatefrom django.utils.safestring import mark_safe register = template.Library() @register.simple_tagdef my_simple_time(v1,v2,v3): return v1 + v2 + v3@register.filterdef sutaoyu(a1,a2): return a1+a2
c、在使用自定义simple_tag、filter的html文件中导入之前创建的 xx.py 文件名
{% load xx %}
d、在html文件中使用simple_tag、filter
{% load xx %} #在使用自定义simple_tag、filter的html文件中导入之前创建的 xx.py 文件名Title {% jiajingze 2 3 4%} #使用simple_tag { { 'maliya'|sutaoyu:"LS" }} #使用fifter
e、在settings中配置当前app,不然django无法找到自定义的simple_tag、fifter
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', #配置app}
f、simple_tag和fifter的优缺点
simple_tag:
缺点:
不能作为if条件 优点: 参数任意fifter:
缺点:
最多两个参数,不能加空格 优点: 能作为if条件