心得:不知道为什么,学习好有意思呀,越来越感兴趣了。今晚写完模板所有内容,明天去重点学习数据库交互内容,加油加油~
DTL与普通的HTML文件的区别:
DTL模板是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进 去,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端。
渲染模板:
将模板渲染成字 符串和包装成 HttpResponse 对象
from django.shortcuts import render,HttpResponse,reverse
def index(request):
context = {'name':'tian'}
return render(request,"front/index.html",context=context)
shortcuts 快捷键的意思,此类中封装了大量我们需要的函数
HttpResponse 函数用来返回字符串给网页的
reverse 函数用来反转获得网页url的
render 函数 :渲染模板
参数一:request 不能少,必须的参数
参数二:‘front/index.html’ 模板所在路径
参数三:传递字符,必须是字典格式的
模板路径定义:
- 不用改setting文件,直接在app路径下创建模板路径:front/templates/front/index.html
- 修改setting文件,将模板文件都放入创建文件夹下:
[os.path.join(BASE_DIR, ‘templates’)]
模板语法
传递变量
- 列表
def index(request):
context = {'name':['tian','jian','hello']}
return render(request,"front/index.html",context=context)
<p>哈喽 {{name.1}}</p>
可以用点.的方式进行索引查询,0代表列表第一个元素
- 元组
类似于列表
- 字典
def index(request):
context = {
'info':{
'name':'tian',
'age':18,
'sex':'male',
}
}
return render(request,"front/index.html",context=context)
<p>哈喽 {{info.name}}</p>
可以用点.的方式进行查找这个字典的 username 这个 key 对应的值
- 类
class Info():
name='tian'
age=18
sex='male'
def index(request):
context = {'info':Info()}
return render(request,"front/index.html",context=context)
<p>哈喽 {{info.name}}</p>
用点.的方式是一个对象,那么就会查找这个对象的 username 属性,或者是 username 这个方法。
模板标签
- if 标签,可以使用 ==、!=、<、<=、>、>=、in、not in、is、is not 等判断运算符。
{% if 'tian' in info.name %}
<p>你好</p>
{% else %}
<p>你好帅</p>
{% endif %}
- for…in… 标签 可以遍历列表、元 组、字符串、字典
{% for k,v in info.items %}
<p>key :{{ k }}</p>
<p>values :{{ v }}</p>
{% endfor %}
- url 标签 在模版中,我们经常要写一些 url,使用这种反转的方式来实现,类似于 django 中的 reverse 一 样
url 反转的时候需要传递参数
path('book/<name>/',views.book,name='book_name'),
<a href="{% url 'front:book_name' name='三国演义' %}">书名</a>
使用 url 标签反转的时候要传递查询字符串的参数,那么必须要手动在在后面添 加
path('book/author/',views.author,name='author'),
<a href="{% url 'front:author' %}?author=罗贯中 ">作者</a>
注意:如果需要传递多个参数,那么通过空格的方式进行分隔,关键字之间一定要用空格分开,负责会出现莫名的错误。url字符串拼接字符串时不需要引号。
模版常用过滤器
- add 这个过滤器会尝试将 值 和 参数 转换成整形然后进行相 加。如果转换成整形过程中失败了,那么会将 值 和 参数 进行拼接。如果是字符串,那么会拼接 成字符串,如果是列表,那么会拼接成一个列表。
{{ info.name|add:'asd'}}
python源码:
def add(value, arg):
"""Add the arg to the value."""
try:
return int(value) + int(arg)
except (ValueError, TypeError):
try:
return value + arg
except Exception:
return ''
- 移除值中所有指定的字符串。
{{ value|cut:" " }}
python源码
def cut(value, arg):
"""Remove all values of arg from the given string."""
safe = isinstance(value, SafeData)
value = value.replace(arg, '')
if safe and arg != ';':
return mark_safe(value)
return value
- date 将一个日期按照指定的格式,格式化成字符串
Y 四位数字的年份 2018
m 两位数字的月份 01-12
d 两位数字的天 01-31
H 小时,24小时格式的,1-9前面有0前缀 01-23
i 分钟,1-9前面有0前缀 00-59
s 秒,1-9前面有0前缀 00-59
{{ info.birthday|date:'Y/m/d-H:i:s' }}
#Dec. 25, 2019, 10:02 p.m.
#2019/12/25-22:02:18
- default
{{ value|default:"nothing" }}
如果 value 是等于一个空的字符串。比如 “” ,那么以上代码将会输出 nothing
- first返回列表/元组/字符串中的第一个元素。last
- lower将值中所有的字符全部转换成小写。upper
- join类似与 Python 中的 join ,将列表/元组/字符串用指定的字符进行拼接
- length获取一个列表/元组/字符串/字典的长度。
引入模板
include方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>哈喽哈喽</p>
</body>
</html>
{% include 'front/base.html' %}
<p>我是main内容</p>
模板继承
base模板:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}Title{% endblock title %}</title>
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li>
<a href="/">首页</a>
<a href="{% url 'front:son' %}">内容</a>
</li>
</ul>
{% endblock sidebar %}
</div>
{% block content %}{% endblock content %}
<p>哈喽哈喽</p>
</body>
</html>
son.html
{% extends 'front/base.html' %}
{% block title %}子类的title,替换了原来的字符{% endblock title %}
{% block content %}
<p>哈哈,我可以写自己的方法</p>
{% endblock content %}
结果:
base:
son:
需要注意的是:extends标签必须放在模版的第一行。 子模板中的代码必须放在block中,否则将不会被渲染。
在定义 block 的时候,除了在 block 开始的地方定义这个 block 的名字,还可以在 block 结束 的时候定义名字。比如 {% block title %}{% endblock title %} 。
将需要重写的内容加入block进行包裹,在子类中写入新的方法需要在包裹中的block写如内容。
父类:{% block title%} 我是一个标题 {% endblock%}
子类调用:{% extends '父类.html'%}
{% block title %} 我是新的标题{% endblock%}
加载静态文件
在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件, js 执行文件以及一些图片 等。因此在 DTL 中加载静态文件是一个必须要解决的问题。在 DTL 中,使用 static 标签来加载 静态文件
- 创建文件夹和修改setting设置
- 加载头部static
link标签为加载css文件
img标签为加载图片
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}Title{% endblock title %}</title>
<link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li>
<a href="/">首页</a>
<a href="{% url 'front:son' %}">内容</a>
</li>
</ul>
{% endblock sidebar %}
</div>
<img src="{% static 'images/tian.jpg'%}" alt="">
{% block content %}{% endblock content %}
<p>哈喽哈喽</p>
</body>
</html>