模板介绍

  作为web框架,Django提供了模板,用于编写html代码(嵌入模板代码,更快更方便的完成页面开发,在通过视图中渲染模板,将最终生成的页面返回给浏览器(客户端))。模板是关于外表的渲染的,程序逻辑反而不是很重,模板的设计实现了业务逻辑View与显示的内容Template的解耦。一个视图可以使用任意的模板,一个模板可以被多个视图使用。

  模板包含两部分:

        静态部分:html、css、js

        动态部分:模板语言

项目准备:

   新建项目---------创建应用------安装应用(设置里面)--------配置模板路径---------本地化---------mysql数据库(导包)---------URLconf--------视图

mysql使用之前的数据库

模板处理:

  Django处理模板两个阶段:

    1、加载:根据路径找到模板,编译放在内存中

    2、渲染:使用上下文数据对模板传值,并返回动态生成的网页(render函数,渲染:减少开发人员重复写,加载渲染代码)

模板配置:(在设置中添加模板路径)(TEMPLATES中配置):

  'DIRS': [os.path.join(BASE_DIR, 'templates')],

创建模板文件:

在视图函数中,加载渲染模板。

模板语言

  

作用:

  获取、处理传入到模板中的上下文数据,动态的产生页面内容。

  包括4种类型,分别是

    1、变量

 变量语法:

{{ 变量 }}

 变量解析规则:如book.name,会按照下列顺序解析:

  1、字典book["name"]

  2、先属性后方法,将book当做对象,查找属性name,如果没有就继续查找name()方法。

  3、格式为book.0则解析为列表book[0]。

  如果变量不存在,插入空字符串。在模板中调用方法时不能传递参数,如果要是用传递参数的方法,需要使用过滤器。

 

    2、标签

      标签语法:

{% 代码段 %}

常用标签:

  for循环标签:

{% for item in 列表 %}
执行循环逻辑
{{ forloop.counter }}获取当前是第几次循环,从1开始
{% empty %}
列表为空或不存在时执行此逻辑
{% endfor %}

  if标签:

{% if ... %}
逻辑1
{% elif ... %}
逻辑2
{% else %}
逻辑3
{% endif %}

比较远算符标签:

  运算符左右两侧必须有空格:

==
!=
<
>
<=
>=

注意:运算符两侧不能紧挨变量或常量

布尔运算符标签:

  and
or
not

  3、过滤器(也可以自定义)

1、过滤器作用:模板语言中不允许带参数的函数,如果要对变量进行处理,就需要使用过滤器
2、使用管道符号 | 来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中

过滤器语法:

一个参数时:变量|过滤器

两个参数时:变量|过滤器:参数

第一个参数就是变量,如果过滤器需要追加参数,则使用:传递参数,冒号后面可以多传一个参数。

常用过滤器:

length,返回字符串、列表、元组、字典的元素个数
变量|length default,如果变量不存在时则返回默认值
变量|default:默认值 date,用于对日期类型的值进行字符串格式化 常用的格式化如下
Y表示年,格式为4位,y表示两位的年
m表示月,格式为01,02,12等
j表示日,格式为1,2等
H表示时,24进制,h表示12进制的时
i表示分,为0-59
s表示秒,为0-59
日期|date:'Y年m月j日 H时i分s秒'

过滤器演示

urls.py

 path('filter/', views.filter),

views.py

#过滤器的演示
def filter(request):
#获取全部书籍信息
booklist = Books.objects.all()
content = {"booklist":booklist}
return render(request,"Book/filter.html",content)

templates/Book/filter.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤器演示</title>
</head>
<body>
<ul>
{% for book in booklist %}
{% if book.name|length > 4 %}
<li style="background: red">{{ book.name }}---------{{ book.pub_data|date:"Y-m-d" }}</li>
{% else %}
<li>{{ book.name }}-------{{ book.pub_data }}</li>
{% endif %}
{% endfor %}
</ul>
</body>
</html>

当内建的过滤器不能满足我们使用的时候,需要自定义过滤器。过滤器就是python中的函数。

自定义过滤器

  需求:循环到奇数时,内容背景为红色

     循环到偶数时,内容背景为绿色

urls.py:

   path('auto_filter/', views.auto_filter),

views.py

#自定义过滤器的使用
def auto_filter(request):
#获取书籍全部信息
booklist = Books.objects.all()
content = {"booklist":booklist}
return render(request,"Book/auto_filter.html",content)

自定义奇数偶数的过滤器:1、在Book应用目录下创建python package包(templatetags),2、在包下新建py文件用于定义过滤器函数。

自定义过滤器函数:

#导入注册模块
from django.template import Library #创建注册对象,命名为register
register = Library() #把以下函数注册成过滤器 @register.filter
#定义求奇数偶数的函数
def mod(num):
#返回的0,1代表False和True
return num%2

模板:需要在模板中使用load标签加载自定义的过滤器:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义过滤器</title>
</head>
<body>
{#需要加载自定义的过滤器#}
{% load auto_filter %}
<ul>
{% for book in booklist %}
{#奇数执行的逻辑#}
{% if forloop.counter|mod %}
<li style="background: green">{{ book.name }}</li>
{#偶数执行逻辑#}
{% else %}
<li style="background: red">{{ book.name }}</li>
{% endif %}
{% endfor %}
</ul> </body>
</html>

自定义接收多个参数的过滤器

 自定义对任意整数求余数的过滤器(auto_filter.py)

@register.filter
def mod1(num1,num2):
#余数为0返回False,反之True
return num1%num2

模板:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义过滤器</title>
</head>
<body>
{#需要加载自定义的过滤器#}
{% load auto_filter %}
<ul>
{% for book in booklist %} {% if forloop.counter|mod1:3 %}
{#执行不为0的逻辑#}
<li style="background: green">{{ book.name }}</li>
{#执行0的逻辑#}
{% else %}
<li style="background: red">{{ book.name }}</li>
{% endif %}
{% endfor %}
</ul> </body>
</html>

效果图:

必须注意的事项:

.自定义过滤器的python包,必须命名为templatetags
.创建注册对象,必须命名为register
3.过滤器的第一个参数就是变量,当有第二个参数时,后面需要使用冒号,最多只能传二个参数

    4、注释

就是不会编译的内容,(html注释只能注释html。不能注释模板语言)

语法

单行注释语法如下
{#...#}
多行注释使用comment标签,语法如下
{% comment %}
...
{% endcomment %}

模板继承

  典型应用:网站的头尾信息

 

父模板

  这段代码会多次出现,为了减少开发的重复,就把这段代码内容定义到父模板中。在父模板中也可以使用上下文传递过来的数据。

  定义在templates文件目录下

  使用到的标签block标签:用于在父模板中预留的区域,留给字模板填充一些不同的内容。

语法:

{% block 名称 %}
预留区域,可以编写默认内容,也可以没有默认内容
{% endblock 名称 %}

子模板

  定义在templates/应用名文件目录下。

  extends标签:继承,写在子模板文件的第一行。

  只需要填充自己想要不同的页面的预留区域。

语法:

{% block 名称 %}
实际填充内容
{{ block.super }} 用于获取父模板中block的内容,也可以不获取
{% endblock 名称 %}

演示:

文件目录展示:

 父模板:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父模板</title>
</head>
<body> {% block top %}
<h1>这是网页头部</h1>
{% endblock top %} {% block content1 %}
<div>啦啦啦啦啦</div>
{% endblock content1 %} {% block content2 %}
{#预留区域#}
{% endblock content2 %} {% block bottom %}
<h1>这是网页尾部</h1>
{% endblock bottom %} </body>
</html>

匹配url:

path("jiceng/",views.jicheng)

视图

 # 模板继承
def jicheng(request):
# 获取数据库书籍列表信息
booklist = Books.objects.all()
# 构造上下文
content = {'booklist': booklist}
return render(request, 'Book/jicheng.html', content)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>子模板</title>
</head>
<body> {#继承父模板#}
{% extends 'base.html' %} {% block content2 %}
<ul>
{% for book in booklist %}
<li>{{ book.name }}</li>
{% endfor %}
</ul>
{% endblock content2 %} </body>
</html>

必须注意的地方:

1.父模板定义在templates文件目录下
2.子模板定义在templates/应用文件目录下
3.子模版继承父模板之后,本身原有的内容是不起作用的
4.父模板不能把上下文传给子模板,只继承内容不继承上下文

07-Django模板(1)的更多相关文章

  1. Django模板语言相关内容

    Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 ...

  2. Django模板语言初识

    一.Django框架简介 1.MVC框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...

  3. 07: Django 使用ldap登录、注销等

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  4. Django模板语言,过滤器整理

    Django模板语言,过滤器整理 1. add {{ value|add:"2" }} 把add后的参数加给value: 处理时,过滤器首先会强制把两个值转换成Int类型. 如果强 ...

  5. Django模板语言,标签整理

    Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...

  6. Django模板语言 标签整理

    Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...

  7. Django模板语言, 过滤器整理

    Django模板语言,过滤器整理 1. add {{ value|add:"2" }} 把add后的参数加给value: 处理时,过滤器首先会强制把两个值转换成Int类型. 如果强 ...

  8. Django模板与Vue.js冲突问题

    参考: https://my.oschina.net/soarwilldo/blog/755984 方法1:修改vue.js的默认的绑定符号 Vue.config.delimiters = [&quo ...

  9. 在 Django 模板中遍历复杂数据结构的关键是句点字符

    在 Django 模板中遍历复杂数据结构的关键是句点字符 ( . ). 实例二 mysit/templates/myhtml2.html修改如下 <!DOCTYPE html> <h ...

  10. python django 模板

    1 用两个大括号括起来的文字{{person_name}} 称为变量 2 被 大括号和面分号包围的文件({% if ordered_warranty %})是模板标签 3 过滤器是用管道符(|) 和U ...

随机推荐

  1. 华为网络设备修改console密码

    user-interface con 0set authentication password cipher 新密码 有的版本为 <FW> system-view[FW] user-int ...

  2. mssql sqlserver sql对使用逗号分隔的字符串 转换为数据表的另类方法实现

    转自:http://www.maomao365.com/?p=10739 摘要: 下文讲述在sqlserver 对逗号分隔的字符串转换为数据表的另类方法实现,如下所示: 实验环境:sql server ...

  3. jenkins实现git自动拉取代码时替换配置文件

    jenkins实现从git上自动拉取源代码——>自动编译——>发布到测试服务器——>验证测试,这个大家应该都知道,但是关于源代码里的配置文件,可能就会有点头疼了, 一般测试都会自己的 ...

  4. 通过pywin32库来上传文件

    先来安装:pip install pywin32 辅助定位工具winspy下载地址:https://sourceforge.net/projects/winspyex/ 打开后是这玩意: 按住靶心拖拽 ...

  5. docker面试题和解答(一)

    什么Docker Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行. Docker与虚拟机有何不同 Docker不是虚拟化方法 ...

  6. vue axios 在 edge 浏览器下的bug

    Edge 浏览器的版本: Microsoft Edge 42.17134.1.0Microsoft EdgeHTML 17.17134 当请求为POST 时,转换为  GET,并且始终报  “来自缓存 ...

  7. angularjs路由监听,uirouter感知路由变化,解决uirouter路由监听不生效的问题

     壹 ❀ 引 angularjs除了惊为天人的双向数据绑定外,路由也是出彩的一笔,通过路由配置,我们能在不发起页面跳转的情况下,对当前页内容进行整体更新,angularjs提供了ngRoute模块用于 ...

  8. 【linux命令】chgrp改变文件或目录的属组

    在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...

  9. 第一章 1.1 计算机和Python基础

    一.计算机基础 1.1.进制 计算机中的数字有四种存在形式,分别是:十进制.二进制.八进制和十六进制 1.1.1.十进制 1.基数:0-9 2.进位:逢10进1 3.位权:例:123 = 3*10^0 ...

  10. 可能是最详细的UMD模块入门指南

    学习UMD 介绍 这个仓库记录了一些关于javascript UMD模块规范的demo,对我学习UMD规范有了很大帮助,希望也能帮助到你. 回顾 之前也写了几篇关于javascript模块的博客,链接 ...