python之django母板页面
其实就是利用{% block xxx %} {% endblock %}的方式定义一个块,相当于占位。存放在某个html中,比如base.html
然后在需要实现这些块的文件中,使用继承{% extends "base.html" %}的方式引入母板文件,然后在{% block xxx %}......{% endblock %}块定义中实现具体的内容。
base.html示例:注意块的定义。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="http://v3.bootcss.com/favicon.ico">
<link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css">
<title>所有的书都在这里</title>
{% block page_css %}
{% endblock %}
{% block page_js %}
{% endblock %} <!-- Bootstrap core CSS -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<link href="http://v3.bootcss.com/assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet"> <!-- Custom styles for this template -->
<link href="http://v3.bootcss.com/examples/dashboard/dashboard.css" rel="stylesheet"> <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
<!--[if lt IE 9]><script src="http://v3.bootcss.com/assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
<script src="http://v3.bootcss.com/assets/js/ie-emulation-modes-warning.js"></script> <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head> <body> {% include "nav.html" %} <div class="container-fluid">
<div class="row">
<div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar">
<li class="{% block book_class %}{% endblock %}"><a href="/book_list/">所有的书 <span class="sr-only">(current)</span></a>
</li>
<li class="{% block publisher_class %}{% endblock %}"><a href="/publisher_list/">出版社</a></li>
<li class="{% block author_class %}{% endblock %}"><a href="/author_list/">作者</a></li> </ul>
</div>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
{% block main_body %}
{#这里是每个页面不同的部分#}
{% endblock %}
</div>
</div>
</div> <!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="http://v3.bootcss.com/assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<!-- Just to make our placeholder images work. Don't actually copy the next line! -->
<script src="http://v3.bootcss.com/assets/js/vendor/holder.min.js"></script>
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<script src="http://v3.bootcss.com/assets/js/ie10-viewport-bug-workaround.js"></script>
</body>
</html>
某个继承页:
{# 继承母板 #}
{% extends 'base.html' %} {% block book_class %}
active
{% endblock %}
{% block page_css %}
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix %}book_list_only.css">
{% endblock %} {#把自己页面的内容,填入母板里面相应的位置#}
{% block main_body %}
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">我是自定义内容,用来替换母板中指定的位置</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-8"> </div>
<div class="col-md-4"><a href="/add_book/" class="btn btn-primary"><i class="fa fa-plus-square"></i> 添加新书</a>
<a href="/add_publisher/" class="btn btn-success"><i class="fa fa-plus-square"></i> 添加出版社</a></div>
</div> <table class="table table-dark table-hover">
<thead>
<tr>
<th>#</th>
<th>id</th>
<th>名称</th>
<th>出版社</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for b in books %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ b.id }}</td>
<td>{{ b.title }}</td>
<td>{{ b.publisher.name }}</td>
<td>
<a href="/del_book/?id={{ b.id }}" class="btn btn-danger"><i class="fa fa-trash fa-fw"></i>删除</a>
<a href="/edit_book/?id={{ b.id }}" class="btn btn-info"><i class="fa fa-pencil fa-fw"></i>编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table> </div>
</div>
{% endblock %}
另一个继承页:
{% extends "base.html" %}
{% block main_body %}
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">所有的出版社</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-8"> </div>
<div class="col-md-4"><a href="/add_book/" class="btn btn-primary"><i class="fa fa-plus-circle fa-fw"></i>添加新书</a>
<a href="/add_publisher/" class="btn btn-success"><i class="fa fa-plus-circle fa-fw"></i>添加出版社</a></div>
</div> <table class="table table-dark table-hover">
<thead>
<tr>
<th>#</th>
<th>id</th>
<th>名称</th>
<th>地址</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for p in publisher %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ p.id }}</td>
<td>{{ p.name }}</td>
<td>{{ p.addr }}</td>
<td>
<a href="/del_publisher/?id={{ p.id }}" class="btn btn-danger"><i class="fa fa-remove fa-fw"></i>删除</a>
<a href="/edit_publisher/?id={{ p.id }}" class="btn btn-info"><i class="fa fa-edit fa-fw"></i>编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table> </div>
</div>
{% endblock %}
{% block publisher_class %}
active
{% endblock %}
1. 母版和继承
1. 什么时候用母版?
html页面有重复的代码,把它们提取出来放到一个单独的html文件。
(比如:导航条和左侧菜单)
2. 子页面如何使用母版?
{% extends 'base.html' %} --> 必须要放在子页面的第一行
母版里面定义block(块),子页面使用block(块)去替换母版中同名的块
2. 组件
1. 什么时候用组件?
重复的代码,包装成一个独立的小html文件。
2. 如何使用?
{% include 'nav.html' %}
3. Django模板语言中关于静态文件路径的灵活写法
1. 利用Django模板语言内置的static方法帮我拼接静态文件的路径
{% load static %}
<link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">
2. 利用内置的get_static_prefix获取静态文件路径的别名,我们自行拼接路径
{% load static %}
<link href="{% get_static_prefix %}bootstrap/css/bootstrap.min.css" rel=stylesheet>
3. as语法(一个路径多次用到,可以使用as保存到一个变量,后面就直接使用变量代替具体路径)
4. 自定义的simple_tag
比filter高级一点点
它可以接受的参数个数大于2
5. 自定义的inclusion_tag
用来返回一段html代码(示例:返回ul标签)
1. 定义阶段
在app下面新建templatetags 文件夹(注意是Python包)
新建一个py文件
from django import template
# 生成注册示例,名字必须是register
register = template.Library()
@register.inclusion_tag("ul.html")
def show_ul(num):
num = 1 if num < 1 else int(num)
data = ["第{:0>3}个数字".format(i) for i in range(1, num+1)]
return {"data": data}
2. 调用阶段
{% load xx %}
{% show_ul 10 %}
python之django母板页面的更多相关文章
- python Django注册页面显示头像
python Django注册页面显示头像(views) def register(request): ''' 注册 :param request: :return: ''' if request.m ...
- [Python] 利用Django进行Web开发系列(一)
1 写在前面 在没有接触互联网这个行业的时候,我就一直很好奇网站是怎么构建的.现在虽然从事互联网相关的工作,但是也一直没有接触过Web开发之类的东西,但是兴趣终归还是要有的,而且是需要自己动手去实践的 ...
- [Python] 利用Django进行Web开发系列(二)
1 编写第一个静态页面——Hello world页面 在上一篇博客<[Python] 利用Django进行Web开发系列(一)>中,我们创建了自己的目录mysite. Step1:创建视图 ...
- Python和Django在Windows上的环境搭建
作为一个.NET程序员,真心不喜欢Python以及PHP这种松散的语法.有人说,程序员应该多学几门语言,本想学习Java,无奈感觉Java的语法太啰嗦了.很多人都推荐Python,说它的语法简洁,执行 ...
- Python之Django环境搭建(MAC+pycharm+Django++postgreSQL)
Python之Django环境搭建(MAC+pycharm+Django++postgreSQL) 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7828614. ...
- [Python] 建 Django 项目
Python和Django的安装见这里:http://www.runoob.com/django/django-install.html 安装 Django 之后,您现在应该已经有了可用的管理工具 d ...
- linux下配置python环境 django创建helloworld项目
linux下配置python环境 1.linux下安装python3 a. 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件) yum groupinstal ...
- Python学习---Django下的Sql性能的测试
安装django-debug-tools Python学习---django-debug-tools安装 性能测试: settings.py INSTALLED_APPS = [ ... 'app01 ...
- 【Python】Django学习一:第一个Django程序
项目开发环境 Python 3.6 Django 1.11.5 Django安装 在开始安装Django之前,Django更新比较频繁,所以要选择合适的版本,这里选择Django1.11.5. pip ...
随机推荐
- Visual Studio color schemes
Vs环境主题配置 下载地址:https://studiostyl.es/ Son of Obsidian 下载:son-of-obsidian_vs2015.zip Litle monokai vst ...
- layui
给大家推荐个比较好用的前端ui框架layui,遵循原生HTML/CSS/JS的书写与组织形式,门槛极低,拿来即用,而且layui除了ie6/7不兼容其他都兼容,而且还是响应式布局 1,获得layui后 ...
- webpack学习笔记 (一)
一.安装nodejs: 点击打开nodejs官方站点: 点击下图框住的按钮,下周nodejs安装包: 安装下载好的安装包. 安装完毕之后,在cmd中输入node -v查看是否已经安装成功 如果有版本 ...
- 删除链表的倒数第N个节点(java实现)
题目: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链 ...
- [python]目录及文件操作
Python OS模块和shutil模块 获取路径 # 获取当前路径 pwd = os.getcwd() # 获取上级路径 a_pwd = os.path.abspath(os.path.dirnam ...
- MySQL 存储过程的变量
MySQL 存储过程的变量 变量是一个命名数据对象,变量的值可以在存储过程执行期间更改.我们通常使用存储过程中的变量来保存直接/间接结果. 这些变量是存储过程的本地变量. 注意:变量必须先声明后,才 ...
- Genymotion模拟器无法直接安装APP
使用Genymotion模拟器安装APP的过程中,将我们的apk拖进去模拟器报以下错误: Genymotion官网常见问题解决办法汇集地址:https://www.genymotion.com/#!/ ...
- centos6.0和7.4默认网卡配置
6.0 vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" NM_CONTROLLED="yes&qu ...
- 崔庆才Python3网络爬虫开发实战电子版书籍分享
资料下载地址: 链接:https://pan.baidu.com/s/1WV-_XHZvYIedsC1GJ1hOtw 提取码:4o94 <崔庆才Python3网络爬虫开发实战>高清中文版P ...
- C++标准模板库(STL)之Pair
1.Pair的常用用法 pair:两个元素绑在一起作为一个合成元素.可以看成是两个元素的结构体. struct pair { typeName1 first; typeName2 second; }; ...