目录
什么是模板系统
模板是一个文本, 用于分离文档的表现形式和内容.
变量
- 被大括号和百分号包围的文本称为变量(例如
{% person_name %}
)
模板标签
for标签
- 被大括号和百分号包围的文本(例如 :
{% for item in itme_list %}
).
if标签
- 例如 :
{% if ordered_warranty %}
.
ifequal
{% ifequal %}
标签比较两个值, 当他们相等时, 显示在{% ifequal %}
和{% endifequal %}
之中所有的值- 例如 : 比较两个模板变量user和currentuser.
{% ifequal user currentuser %}
<h1>Welecome!</h1>
{% endifequal %}
{% ifequal %}
支持可选的{% else %}
标签
{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% else %}
<h1>No News Here</h1>
{% endifequal %}
只有模板变量, 字符串, 整数和小数可以作为
{% ifequal %}
标签的参数.
注释
注释使用 {##}
, 这种语法的注释不能跨越多行.
多行注释使用 {% comment %}{% endcomment %}
标签
过滤器
-
过滤器使用管道字符, 如 :
{{ name|lower }}
: 显示的内容是变量{{ name }}
被过滤器lower
处理后的结果, 它的作用是转换文本为小写.
-
过滤管道可以被套接, 也就是说, 一个过滤管道的输出可以作为下一个管道的输入, 如 :
{{ my_list|first|upper }}
: 它的作用是, 取第一个字段, 取到以后转换为大写.
-
有些过滤器有参数, 过滤器的参数跟随冒号之后用双引号包含, 如:
{{ bio|truncateword:"30" }}
(Django2.0 变成了{{ bio|truncatechars:"30" }}
)
一些常用的过滤器
- addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面
- date : 按指定的格式字符串参数格式化 date 或者 datetime 对象
- length : 返回变量的长度.
如何使用模板系统
- 用指定模板文件路径的方式创建Template对象
- 调用模板对象的render方法, 并且传入一套变量context, 它将返回一个基于模板的展现字符串, 模板中的变量和标签会被context值替换
在视图中使用模板
模板应该和视图实现分离, 可以把模板放到一个单独的文件中, 并且让视图加载该文件.
创建templates文件放置html文件
模板加载
为了减少模板加载调用过程及模板本身的冗余代码, Django提供了一个API, 用于从磁盘中加载模板.
配置settings文件
TEMPLATES = [
{
'DIRS': [
os.path.join(BASE_DIR, 'templates')
],
},
]
render_to_response()
Django提供一个了render_to_response()函数, 可以一次性的载入某个模板文件, 渲染它, 然后将此作为HttpResponse返回.
- 使用render_to_response()
from django.shortcuts import render_to_response
import datetime
def current_datetime(request):
now = datetime.datetime.now()
return render_to_response('current_datetime.html', {'current_date': now})
locals()
- locals()内建函数返回的字典对所有局部变量的名称与值进行映射. 视图可以重新为 :
def home(request):
date = datetime.datetime.now()
return render(request, 'home.html', locals())
模板继承
定义基础模板
- 将基础模板命名为base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
{% block footer %}
<hr>
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>
</html>
{% block %}
标签告诉引擎, 子模板可以重载这些部分
修改home.html模板
{% extends "base.html" %}
{% block title %}我的网站{% endblock %}
{% block content %} 现在的时间是{{ date }} {% endblock %}
模板继承工作方式
在加载home.html模板时, 模板引擎发现了
{% extends %}
标签. 标记这个模板是一个子模板, 模板引擎立即装载其父模板base.html
模板引擎用子模板的内容替换父模板中的block
由于子模板并没有定义footer块, 模板系统将使用父模板中定义的值.
继承模板三层法
- 创建base.html 模板, 这些都是不常修改甚至从不修改的部分
- 为网站的每个区域创建
base_SECTION.html
模板 ( 例如,base_photos.html
和base_forum.html
), 这些模板对base.html
进行拓展, 并包含区域特定的风格与设计 - 为每种类型的页面创建独立的模板
模板继承的注意事项
- 如果在模板 中使用
{% extends %}
, 必须保证其为模板中的第一个模板标记. - 如果需要父模板中的块的内容, 可以用 {{ block.super }} 标签. 也就是说, 引入对应block后,在其前后,都可以增加相应的内容
- 不允许在同一个模板中定义多个同名的 {% block %}.
配置mysql数据库
setting.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'NAME': 'mydb',
'USER': 'lsf',
'PASSWORD': 'fei1028',
}
}
创建模型
一本书可以有几个作者,一个作者也可以有几本书,所以是manytomany; 一个出版社可以有很多书,但一本书只可以有一个出版社,所以是onetomany
models.py
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
每个数据模型都是django.db.models.Model
每个数据模型相当于单个数据库表, 每个属性就是这个表中的一个字段.
它的类型相当于数据库的字段类型.
模型安装
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book',
]
使用 python manage.py check
检测模型有效性
添加数据
>>> from book.models import Publisher
>>> p1 = Publisher(name='Test', address='address', city='beijing', state_province='Beijing', country='china.', website='http://www.apress.com/')
>>> p1.save()
查询数据
>>> Publisher.objects.all()
<QuerySet [<Publisher: Publisher object (1)>]>
相当于SQL语句 :
SELECT id, name, address, city, state_province, country, website
FROM books_publisher;
数据过滤
使用filter()
方法对数据进行过滤
>>> Publisher.objects.filter(name='Test')
<QuerySet [<Publisher: Publisher object (1)>]>
获取单个对象
使用 get()
方法返回单个对象, 如果结果是多个对象会抛出异常, 如果查询没有返回结果也会抛出异常
>>> Publisher.objects.get(name='Test')
<Publisher: Publisher object (1)>
数据排序
使用order_by()
方法对查询结果进行排序
>>> Publisher.objects.order_by('name')
<QuerySet [<Publisher: Publisher object (1)>]>
可以使用class Meta 指定模型的排序方式:
class Meta:
ordering = ['name']
修改单个字段
>>> Publisher.objects.filter(id=1).update(name='test1')
1