模板介绍

  作为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. unittest---unittest断言

    在unittest单元测试中也提供了断言的方式,通过断言判断用例有没有成功. unittest常用断言 unittest框架的TestCase类提供以下方法用于测试结果的判断 方法 检查 assert ...

  2. 火车票买不到?看我用python监控票源

    同事说最近火车票难买,我就帮他用个脚本监控 一下. 最近高铁票比较难买,还有什么候补.要不停的刷,才有时候可以捡漏.有时候明明候补了,到快开车告诉你余票不足,候补失败. 凡事预则立,我打算写个脚本提前 ...

  3. dev c++必须修改的三处默认设置

    此文档记录参加pat考试并且以dev c++[针对5.11版本]软件作为开发工具时,必须修改的三个默认设置. 1.修改默认语言标准 Dev C++ 5.11 版本支持较新的 C 和 C++ 标准,但是 ...

  4. SpringBoot2.0 基础案例(17):自定义启动页,项目打包和指定运行环境

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.打包简介 springboot的打包方式有很多种.可以打war ...

  5. PAT 1010 Radix 进制转换+二分法

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  6. linux查看占用端口号的程序及pid

    netstat -tunlp|grep 端口号 圈出来的就是pid

  7. 面试:Stream#foreach方法摸底三问,你都了解吗

    JAVA8 新增了 Stream API,而在 Stream API 中又为程序员提供了一个遍历集合的 foreach 方法:java.util.stream.Stream#forEach. 那你对这 ...

  8. Implement Dependent Reference Properties 实现从属引用属性 (XPO)

    In this lesson, you will learn how to implement properties whose values can depend on other properti ...

  9. GO基础之切片

    一.什么是切片 Go语言切片是对数组的抽象. Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"): 与数组相比切 ...

  10. git合并多次commit提交

    在开发项目工程中经常会遇到为了一个需求产生多次提交记录.有些是可以接受的,比如按照功能点不同进行的提交.但往往会存在这种,只为了一个小东西进行改动,比如多余文件的提交.书写不规范而不得不提交的情况.多 ...