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. 关于部署php遇到的坑

    业务突然要启动一个久不使用的PHP项目, 发现部署到centos7上后 各种报错 就是不行. 我怀疑是apache或者php问题 就重新安装 编译安装也试过就是不行. 只能按笨办法 在测试环境安装了a ...

  2. 《JavaScript高级程序设计(第3版)》阅读总结记录第二章之在HTML中使用JavaScript

    本章目录: 2.1 <script> 元素 2.1.1 标签的位置 2.1.2 延迟脚本 2.1.3 异步脚本 2.1.4 在XHTML 中的用法 2.1.5 不推荐使用的语法 2.2 嵌 ...

  3. 什么是 ajax?----异步 javascript 和 xml

    GET 用于请求服务器数据 POST 用于上传数据到服务器,或者修改服务器数据 ajax 异步通信,实现页面的局部刷新,按需获取数据,节约带宽,带来更好的用户体验 客户端与服务器在不必刷新浏览器的情况 ...

  4. javascript 零碎笔记

    使用 live-serve 这个工具,可以热更新 js 代码 逻辑运算符: 常用于单边条件判断,比如 真判断(获取子属性) {error && <div className=&q ...

  5. windows运维如何批量远程桌面

    作用:windows下批量管理远程桌面, http://www.appmazing.com/ 官方站点  http://www.appmazing.com/files/RDO_Setup.exe wi ...

  6. zepto与jquery冲突的解决

    一般是不会把zepto和jquery一起来用的.但有时候要引入一些插件,可能就会遇到这样的问题. jquery noConflict() jquery有一个方法叫noConflict() ,可以把jq ...

  7. 如何利用GitHub搜索敏感信息

    如何利用GitHub搜索敏感信息 背景: 最近总是能听到同事说在GitHub上搜到某个敏感信息,然后利用该信息成功的检测并发现某个漏洞,最后提交到对应的SRC(安全应急响应中心)换点money.顿时心 ...

  8. SQL 常用语法记录

    SQL语法 注意:SQL 对大小写不敏感 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). 数据操作语言 (DML) SQL (结构化查询语言)是用于执行查询的语 ...

  9. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  10. [Swift]LeetCode462. 最少移动次数使数组元素相等 II | Minimum Moves to Equal Array Elements II

    Given a non-empty integer array, find the minimum number of moves required to make all array element ...