Django 系列博客(九)

前言

本篇博客介绍 Django 模板的导入与继承以及导入导入静态文件的几种方式。

模板导入

模板导入

语法:``{% include '模板名称' %}

如下:

<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
<style>
.head {
height: 100px;
background-color: #2aabd2;
text-align: center;
line-height: 100px;
font-size: 25px;
}
.container-fluid {
text-align: center;
}
a {
list-style: none;
text-decoration: none !important;
}
</style>
</head>
<body>
<div class="head">图书管理系统</div>
<div class="container-fluid">
<div class="row">
<div class="col-md-3">
{% include 'left.html' %} </div>
<div class="col-md-9">
<div class="pull-right">
{% block right %} {% endblock %}
</div>
{% block content %} {% endblock %} </div>
</div>
</div>
</body>
</html>
<!-- left.html -->
<div>
<div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title"><a href="/book/">图书列表</a></h3>
</div> </div> <div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title"><a href="/author/">作者列表</a></h3>
</div> </div> <div class="panel panel-danger">
<div class="panel-heading">
<h3 class="panel-title"><a href="/publish/">出版社列表</a></h3>
</div>
</div>
</div>
<!-- other.html -->
{% extends 'base.html' %} {% block content %}
{{ blcok.super }}
{% endblock content %}

模板继承

Django 模板引擎中最强大的也是最复杂的除了 orm 就是模板继承了。模板继承可以让您创建一个基本的‘’骨架‘’模板,它包含您站点的全部元素,并且可以定义可以被子模板覆盖的 blocks。

通过下面的例子,可以容易的理解模板继承:

<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css"/>
<title>{% block title %}My amazing site{% endblock %}</title>
</head> <body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
{% endblock %}
</div> <div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>

这个模版,我们把它叫作 base.html, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks。

在这个例子中, block 标签定义了三个可以被子模版内容填充的block。 block 告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置。

子模版可能看起来是这样的:

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。

那时,模版引擎将注意到 base.html 中的三个 block 标签,并用子模版中的内容来替换这些block。根据 blog_entries 的值,输出可能看起来是这样的:

<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>My amazing blog</title>
</head> <body>
<div id="sidebar">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
</div> <div id="content">
<h2>Entry one</h2>
<p>This is my first entry.</p> <h2>Entry two</h2>
<p>This is my second entry.</p>
</div>
</body>
</html>

请注意,子模版并没有定义 sidebar block,所以系统使用了父模版中的值。父模版的 {% block %} 标签中的内容总是被用作备选内容(fallback)。

这种方式使代码得到最大程度的复用,并且使得添加内容到共享的内容区域更加简单,例如,部分范围内的导航。

注意:

  • 如果在模板中使用{% extends %}标签,它必须是模板中的第一个标签。其他的任何情况下,模板继承都将无法工作。
  • base模板中设置越多的{% block %}标签越好。请记住,子模板不必定义全部父模板中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。
  • 如果你发现在大量的模板中复制内容,那可能意味着你应该把内容移到父模板中的一个{% block %}
  • 如果需要从父模板中获取块的内容,{{ block.super }}变量可以完成这个任务。如果要添加父块的内容而不是完全覆盖它,这将非常有用。使用{{ block.super }}插入数据将不会自动转义,因为它已经在父模板中进行了必要的转义。
  • 为了更好地可读性,你也可以给你的{& endblock %}标签一个名字。例如:
{% block content %}
{% endblock content %}

​ 在大型模板中,这个方法可以让你清楚地看到哪个标签被关闭了。

  • 不能在一个模板中定义多个相同名字的block标签。

静态文件

settings.py中的静态文件设置

STATIC_URL = '/static/'

STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]

在模板中加载静态文件

{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

引用 js 文件

{% load static %}
<script src="{% static "mytest.js" %}"></script>

多个文件使用多次取别名

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>

使用 get_static_prefix

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />

{% load static %}
{% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />

使用 inclusion_tag返回 html 代码片段

my_inclusion.py

from django.template import Library

register = Library()

# @register.inclusion_tag('inclusion.html')
# def myinclusion():
# pass @register.inclusion_tag('book_inclusion.html')
def book_inclusion(bookinfo):
print('...', bookinfo)
# print(bookinfo[0]) # for info in bookinfo:
#
# a = infos.values() # print(a.length)
li = []
for foo in bookinfo:
li.append(foo)
return {'bookinfo': li}

book_inclusion.html

<table border="1" class="table">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>price</th>
<th>pub_date</th>
<th>author</th>
<th>pub</th>
<th>edit</th>
<th>delete</th>
</tr>
</thead>
<tbody>
{% for foo in bookinfo %}
<tr>
<td>{{ foo.id }}</td>
<td>{{ foo.name }}</td>
<td>{{ foo.price }}</td>
<td>{{ foo.pub_date }}</td>
<td>{{ foo.author }}</td>
<td>{{ foo.pub }}</td>
<td><a href="/book/edit/?id={{ foo.id }}">edit</a></td>
<td><a href="/book/delete/?id={{ foo.id }}">delete</a></td>
</tr>
{% endfor %} </tbody>
</table>

book.html

{% extends 'base.html' %}

{% block content %}
{% load inclusions %}
{% book_inclusion bookinfo %}
{% endblock %} {% block right %}
<a href="/book/addto/"><button type="button" class="btn btn-info">新增</button></a>
{% endblock %}

Django 系列博客(九)的更多相关文章

  1. Django 系列博客(十六)

    Django 系列博客(十六) 前言 本篇博客介绍 Django 的 forms 组件. 基本属性介绍 创建 forms 类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成 h ...

  2. Django 系列博客(十四)

    Django 系列博客(十四) 前言 本篇博客介绍在 html 中使用 ajax 与后台进行数据交互. 什么是 ajax ajax(Asynchronous Javascript And XML)翻译 ...

  3. Django 系列博客(十三)

    Django 系列博客(十三) 前言 本篇博客介绍 Django 中的常用字段和参数. ORM 字段 AutoField int 自增列,必须填入参数 primary_key=True.当 model ...

  4. Django 系列博客(十二)

    Django 系列博客(十二) 前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询. 聚合查询 语法:aggregate(*args, **kwargs) ...

  5. Django 系列博客(十一)

    Django 系列博客(十一) 前言 本篇博客介绍使用 ORM 来进行多表的操作,当然重点在查询方面. 创建表 实例: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日 ...

  6. Django 系列博客(十)

    Django 系列博客(十) 前言 本篇博客介绍在 Django 中如何对数据库进行增删查改,主要为对单表进行操作. ORM简介 查询数据层次图解:如果操作 mysql,ORM 是在 pymysql ...

  7. Django 系列博客(八)

    Django 系列博客(八) 前言 本篇博客介绍 Django 中的模板层,模板都是Django 使用相关函数渲染后传输给前端在显式的,为了想要渲染出我们想要的数据,需要学习模板语法,相关过滤器.标签 ...

  8. Django 系列博客(七)

    Django 系列博客(七) 前言 本篇博客介绍 Django 中的视图层中的相关参数,HttpRequest 对象.HttpResponse 对象.JsonResponse,以及视图层的两种响应方式 ...

  9. Django 系列博客(六)

    Django 系列博客(六) 前言 本篇博客介绍 Django 中的路由控制部分,一个网络请求首先到达的就是路由这部分,经过路由与视图层的映射关系再执行相应的代码逻辑并将结果返回给客户端. Djang ...

随机推荐

  1. js的算法题

    1.统计一个字符串中出现最多的字母 给出一个字符串,统计出现次数最多的字母.如:“wqeqwhixswiqhdxsq”,其中出现最多的是q. js算法的实现 function findMax(str) ...

  2. Vue中scoped css和css module比较

    scoped css 官方文档 scoped css可以直接在能跑起来的vue项目中使用. 使用方法: <style scoped> h1 { color: #f00; } </st ...

  3. 离校登记网页项目个人总结(Alpha阶段)

    个人小结 在Alpha阶段,我和我的小团队六人,经过六天的努力完成了我们最初需求分析里的基本功能,在这里为我们团队的成功表示祝贺.在这个过程中,对于自己的表现觉得既有做的好的方面,也有很多不足需要改进 ...

  4. 关于height、offsetheight、clientheight、scrollheight、innerheight、outerheight的区别

    二.也是平时经常用到的offsetheight 它返回的高度是内容高+padding+边框,但是注意哦,木有加margin哦,当然一般也木有啥需要把margin加进去的,以上代码为例,结果显示上图h2 ...

  5. python语法_模块_re(正则表达)

    字符串操作方法有: s = 'hello word' s.find('l') 查询第一个l的索引 s.replace('ll','xx') 替换 s.split('w') 以w进行分割 这些都是完全匹 ...

  6. Hadoop 集群安装(从节点安装配置)

    1.Java环境配置 view plain copy sudo mv /tmp/java /opt/ jdk安装完配置环境变量,编辑/etc/profile: view plain copy sudo ...

  7. PHP7CMS 无条件前台GETSHELL

    PHP7CMS 无条件前台GETSHELL Version:2018-10-09 //最新版中以修复此漏洞 这个漏洞很简单,如果作者在写代码的时候考虑到一点点安全方面,其实都可以避免的.   01 0 ...

  8. Animator 动画第一次播放正常,之后播放都不正常的问题解决

    Animator 动画第一次播放正常,之后播放都不正常的问题解决 问题描述 第一次点击图片动画播放正常,在点击文字之后,图片没有显示出来,点击空白,播放动画,显示文字. 写了一个卡片翻转的动画,代码如 ...

  9. Python开发虚拟环境使用virtualenvwrapper的搭建及pycharm链接步骤

    virtualenv 是一个创建隔绝的Python环境的工具.virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包.创建的环境是独立的,互不干扰,无需sudo ...

  10. [Swift]LeetCode784. 字母大小写全排列 | Letter Case Permutation

    Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...