Django安装配置
目录
1、安装Django Web框架
Django是基于Python的重量级开源Web框架。Django拥有高度定制的ORM和大量的API,简单灵活的视图编写,优雅的URL,适于快速开发的模板和强大的管理后台,这使得它在Python Web开发领域拥有着不可动摇的地位。Instagram、FireFox、国家地理杂志等著名网站都使用了Django进行开发。
安装Django Web框架有3种方式,分别是使用pip安装Django、使用virtualenv安装Django和使用Anaconda安装Django,下面分别介绍。
(1)使用pip安装Django
在命令行中执行“pip install django==2.0”命令,即可安装指定的2.0版本的Django,如图12所示。
图12 使用pip安装Django
(2)使用virtualenv安装Django
在多个项目的复杂工作中,常常会碰到使用不同版本的Python包,而虚拟环境则会处理各个包之间的隔离问题。virtualenv是一种虚拟环境,该环境中可以安装Django,步骤如下:
在命令行中执行“pip install virtualenv”命令即可。安装完成后,在命令行中进入到要创建虚拟环境的路径(如H:\code\djangodemo),然后执行“virtualenv venv”即可在“H:\code\djangodemo”文件夹中创建一个名为venv的虚拟环境。继续执行“venv\Scripts\activate”命令即可激活虚拟环境。最后在激活后的venv中执行“pip install django==2.0”命令就可以安装2.0版本的Django了,如图13所示。
图13 使用virtualenv安装Django
(3)使用Anaconda安装Django
Anaconda也是一种虚拟环境,严格来讲它是一种包管理工具,包含了conda、Python等180多个科学包及其依赖。Anaconda的下载地址为:“https://www.continuum.io/downloads”,下载完成按照提示安装即可。安装完成输入以下命令创建虚拟环境:
conda create -n venv1 python=3.8
执行上面的命令后,系统会创建一个基于Python3.8的虚拟环境。执行activate venv1激活环境,然后执行“conda install django”命令安装Django,如图14所示。
图14 使用Anaconda安装Django
2、创建一个Django项目
本小节我们将开始讲解如何使用Django创建一个项目,步骤如下:
(1)首先在D盘(读者可以根据实际情况选择)根目录下创建用于保存项目文件的目录,这里创建的目录为“D:\Webprojects”。
(2)在Webprojects文件夹中创建environments目录用于放置虚拟环境,然后打开cmd,输入如下创建环境命令:
virtualenv D:\Webprojects\environments\django2.0
(3)使用如下命令在命令行激活环境:
D:\Webprojects\environments\django2.0\Scripts\activate
(4)使用“django-admin”命令创建一个项目:
django-admin startproject demo
(5)使用Pycharm打开demo项目,查看目录结构,如图15所示。
图15 Django项目目录结构
项目已经创建完成,Django项目中的文件及说明如表3所示。
表3 Django项目中的文件及说明
文 件 |
说 明 |
manage.py |
Django程序执行的入口 |
db.sqlite3 |
sqlite的数据库文件,Django默认使用这种小型数据库存取数据,非必须 |
templates |
Django生成的HTML模板文件夹,我们也可以在每个app中使用模板文件夹 |
demo |
Django生成的和项目同名的配置文件夹 |
settings.py |
Django总的配置文件,可以配置App、数据库、中间件、模板等诸多选项 |
urls.py |
Django默认的路由配置文件 |
wsgi.py |
Django实现的WSGI接口的文件,用来处理Web请求 |
(6)在Pycharm中单击运行项目,或者在虚拟环境命令行中执行以下命令运行项目:
python manage.py runserver
此时可以看到Web服务器已经开始监听8000端口的请求了。在浏览器中输入:“http://127.0.0.1:8000”,即可看到创建的Django项目页面,如图16所示。
图16 Django项目页面
(7)创建完Django项目后,在Pycharm的命令行执行以下命令,可以为Django项目生成数据表,并创建一个账户名和密码。
python manage.py migrate # 执行数据库迁移生成数据表 python manage.py createsuperuser # 按照提示输入账户和密码,密码强度符合一定的规则要求(管理员账号)
效果如图17所示。
图17 为Django项目创建账户和密码
(8)重新启动服务器,在浏览器中访问“http://127.0.0.1:8000/admin”,使用刚刚创建的账户登录,即可看到后台管理界面,如图18所示。
图18 Django项目的后台管理界面
3、创建App
在Django项目中,推荐使用App来完成不同模块的任务,通过执行如下命令可以启用一个应用程序。
python manage.py startapp app1
此时,在项目的根目录下可以看到一个名称为app1的目录,如图19所示。
图19 Django项目的App目录结构
Django项目中的文件及说明如表4所示。
表4 Django项目中App目录的文件及说明
文 件 |
说 明 |
migrations |
执行数据库迁移生成的脚本 |
admin.py |
配置Django管理后台的文件 |
apps.py |
单独配置添加的每个App的文件 |
models.py |
创建数据库数据模型对象的文件 |
tests.py |
用来编写测试脚本的文件 |
views.py |
用来编写视图控制器的文件 |
下面将已经创建的app1添加到settings.py配置文件中,然后将其激活,否则app1内的文件都不会生效,效果如图20所示。
图20 将创建的app添加到settings.py配置文件中
4、数据模型(models)
(1)在App中添加数据模型
在app1的models.py中添加如下代码:
from django.db import models # 引入django.db.models模块 class Person(models.Model): """ 编写Person模型类,数据模型应该继承于models.Model或其子类 """
# 第一个字段使用models.CharField类型 first_name = models.CharField(max_length=30) # 第二个字段使用models.CharField类型 last_name = models.CharField(max_length=30)
Person模型中的每一个属性都指明了models下面的一个数据类型,代表了数据库中的一个字段。上面的类在数据库中会创建如下的表:
CREATE TABLE myapp_person ( "id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL );
对于一些公有的字段,为了简化代码,可以使用如下的实现方式:
from django.db import models # 引入django.db.models模块 class CreateUpdate(models.Model): # 创建抽象数据模型,同样要继承于models.Model # 创建时间,使用models.DateTimeField created_at = models.DateTimeField(auto_now_add=True) # 修改时间,使用models.DateTimeField updated_at = models.DateTimeField(auto_now=True) class Meta: # 元数据,除了字段以外的所有属性 # 设置model为抽象类。指定该表不应该在数据库中创建 abstract = True class Person(CreateUpdate): # 继承CreateUpdate基类 first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) class Order(CreateUpdate): # 继承CreateUpdate基类 order_id = models.CharField(max_length=30, db_index=True) order_desc = models.CharField(max_length=120)
这时,我们用于创建日期和修改日期的数据模型就可以继承于CreateUpdate类了。
上面讲解了数据模型的创建方式,下面介绍django.db.models提供的常见的字段类型,如表5所示。
表5 Django数据模型中常见字段类型及说明
字 段 类 型 |
说 明 |
AutoField |
一个id自增的字段,但创建表过程Django会自动添加一个自增的主键字段 |
BinaryField |
一个保存二进制源数据的字段 |
BooleanField |
一个布尔值的字段,应该指明默认值,管理后台中默认呈现为CheckBox形式 |
NullBooleanField |
可以为None值的布尔值字段 |
CharField |
字符串值字段,必须指明参数max_length值,管理后台中默认呈现为TextInput形式 |
TextField |
文本域字段,对于大量文本应该使用TextField。管理后台中默认呈现为Textarea形式 |
DateField |
日期字段,代表Python中datetime.date的实例。管理后台默认呈现TextInput形式 |
DateTimeField |
时间字段,代表Python中datetime.datetime实例。管理后台默认呈现TextInput |
EmailField |
邮件字段,是CharField的实现,用于检查该字段值是否符合邮件地址格式 |
FileField |
上传文件字段,管理后台默认呈现ClearableFileInput形式 |
ImageField |
图片上传字段,是FileField的实现。管理后台默认呈现ClearableFileInput形式 |
IntegerField |
整数值字段,在管理后台默认呈现NumberInput或者TextInput形式 |
FloatField |
浮点数值字段,在管理后台默认呈现NumberInput或者TextInput形式 |
SlugField |
只保存字母数字和下划线和连接符,用于生成url的短标签 |
UUIDField |
保存一般统一标识符的字段,代表Python中UUID的实例,建议提供默认值default |
ForeignKey |
外键关系字段,需提供外检的模型参数,和on_delete参数(指定当该模型实例删除的时候,是否删除关联模型),如果要外键的模型出现在当前模型的后面,需要在第一个参数中使用单引号 |
ManyToManyField |
多对多关系字段,与ForeignKey类似 |
OneToOneField |
一对一关系字段,常用于扩展其他模型 |
(2)执行数据库迁移
1)创建完数据模型后,开始做数据库迁移,首先我们不希望用Django默认自带的SQLite数据库,我们想使用MySQL数据库,在项目的settings.py配置文件中找到如下的配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
替换为:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'demo', 'USER': 'root', 'PASSWORD': '您的数据库密码' } }
2)创建数据库,在终端连接数据库,执行以下命令:
mysql -u root -p
3)按照提示输入您的数据库密码,连接成功后执行如下语句创建数据库。
create database demo default character set utf8;
创建成功后,即可在Django中使用数据库迁移,并在MySQL中创建数据表了。创建数据库命令执行效果如图21所示。
图21 创建数据库命令执行效果
4)安装数据库的驱动,Python 3.x使用pymysql作为MySQL的驱动,命令如下:
pip install pymysql
5)然后找到“D:\Webprojcets\demo\demo\__init__.py”文件,在行首添加如下代码:
import pymysql
pymysql.install_as_MySQLdb() # 为了使pymysql发挥最大数据库操作性能
6)执行以下命令,用来创建数据表。
python manage.py makemigrations # 生成迁移文件 python manage.py migrate # 迁移数据库,创建新表
7)创建数据表的效果如图22所示。
图22 创建数据表效果图
创建完成后,即可在数据库中查看这两张数据表了,Django会默认按照“app名称+下划线+模型类名称”的形式创建数据表,对于上面这两个模型,Django创建了如下表:
- Person类对应app1_person表
- Order类对应app1_order表
CreateUpdate是个抽象类,不会创建表结构,在数据库管理软件中查看创建的数据表,效果如图23所示。
图23 在数据库管理软件中查看创建的数据表
(3)了解Django数据API
这里所有的命令将在Django的交互命令行中执行,在项目根目录下启用交互命令行,执行以下命令:
python manage.py shell # 启用交互命令行
导入数据模型命令:
from app1.models import Person, Order # 导入Person和Order两个类
1)创建数据有如下两种方法:
- 方法1
p = Person.objects.create(first_name="hugo", last_name="zhang")
- 方法2
p=Person(first_name="hugo", last_name="张") p.save() # 必须调用save()才能写入数据库
2)查询数据
- 查询所有数据
Person.objects.all()
- 查询单个数据
Person.objects.get(first_name="hugo") # 括号内需要加入确定的条件,因为get方法只返回一个确定值
- 查询指定条件的数据
Person.objects.filter(first_name__exact="hugo") # 指定first_name字段值必须为hugo Person.objects.filter(last_name__iexact="zhang") # 指定last_name字段值必须为zhang,且忽略大小写 Person.objects.filter(id__gt=1) # 查找所有id值大于1的 Person.objects.filter(id__lt=100) # 查找所有id值小于100的 # 排除所有创建时间大于现在时间的,exclude的用法是排除,和filter正好相反 Person.objects.exclude(created_at__gt=datetime.datetime.now(tz=datetime.timezone.utc)) # 过滤出所有first_name字段值包含h的然后将之前的查询结果按照id进行排序 Person.objects.filter(first_name__contains="h").order_by('id') Person.objects.filter(first_name__icontains="h") # 查询所有first_name值不包含h的
3)修改查询到的数据
修改之前需要查询到对应的数据或者数据集,代码如下:
p = Person.objects.get(first_name="hugo")
然后按照需求进行修改,例如:
p.first_name = "john" p.last_name = "wang" p.save()
注意:必须调用save()方法才能保存到数据库。
当然也可以使用get_or_create,如果数据存在就修改,不存在就创建,代码如下:
p, is_created = Person.objects.get_or_create( first_name="hugo", defaults={"last_name": "wang"} )
get_or_create返回一个元组,一个数据对象和一个布尔值,defaults参数是一个字典。当获取数据的时候defaults参数里面的值不会被传入,也就是获取的对象只存在defaults之外的关键字参数的值。
4)删除数据
删除数据同样需要你先查找到对应的数据,然后进行删除,代码如下:
Person.objects.get(id=1).delete() (1,({'app1.Person':1}))
技巧:大多数情况下我们不会直接删除数据库中的数据,我们希望在数据模型定义的时候,添加一个status字段,值为True和False,用来标记该数据是否是可用状态。在想要删除该数据的时候,将其值置为False即可。
5、管理后台
定义好数据模型,就可以配置管理后台了,按照如下代码编辑app1下面的admin.py文件:
from django.contrib import admin # 引入admin模块 from app1.models import Person, Order # 引入数据模型类 class PersonAdmin(admin.ModelAdmin): """ 创建PersonAdmin类,继承于admin.ModelAdmin """ # 配置展示列表,在Person板块下的列表展示 list_display = ('first_name', 'last_name') # 配置过滤查询字段,在Person板块下右侧过滤框 list_filter = ('first_name', 'last_name') # 配置可以搜索的字段,在Person板块下右侧搜索框 search_fields = ('first_name',) # 配置只读字段展示,设置后该字段不可编辑 readonly_fields = ('created_at', 'updated_at') # 绑定Person模型到PersonAdmin管理后台 admin.site.register(Person, PersonAdmin)
配置完成后,启动开发服务器(如果之前设置的账户名和密码无效时,再执行“python manage.py createsuperuser”重新设置账户名和密码),访问“http://127.0.0.1:8000/admin”,效果如图24所示。
图24 Django项目后台管理页面
更改中文显示修改settings.py文件
LANGUAGE_CODE = 'zh-Hans' # 中文 TIME_ZONE = 'Asia/shanghai' # 北京时间
6、路由(urls)
Django的URL路由流程:
- Django查找全局urlpatterns变量(urls.py)。
- 按照先后顺序,对URL逐一匹配urlpatterns每个元素。
- 找到第一个匹配时停止查找,根据匹配结果执行对应的处理函数。
- 如果没有找到匹配或出现异常,Django进行错误处理。
Django支持三种表达格式,分别如下:
- 精确字符串格式,如“articles/2017/”。
一个精确URL匹配一个操作函数;最简单的形式,适合对静态URL的响应;URL字符串不以“/”开头,但要以“/”结尾。
- Django的转换格式:<类型:变量名>,如“articles/<int:year>/”。
该格式是一个URL模板,在匹配URL时获得一批变量作为参数;该格式也是一种常用形式,用于通过URL获取和传递参数。
表6提供了一些格式转换类型及其说明。
表6 格式转换类型及说明
格式转换类型 |
说 明 |
str |
匹配除分隔符(/)外的非空字符,默认类型<year>等价于<str:year> |
int |
匹配0和正整数 |
slug |
匹配字母、数字、横杠、下划线组成的字符串,str的子集 |
uuid |
匹配格式化的UUID,如075194d3-6885-417e-a8a8-6c931e272f00 |
path |
匹配任何非空字符串,包括路径分隔符,是全集 |
- 正则表达式格式,如“articles/(?p<year>[0-9]{4})/”。
借助正则表达式丰富语法表达一类URL(而不是一个);可以通过“<>”提取变量作为处理函数的参数,高级用法;使用该方法时,前面不能使用path()函数,必须使用re_path()函数;表达的全部是str格式,不能是其他类型。使用正则表达式有两种形式,分别如下:
- 不提取参数:比如“re_path(articles/([0-9]{4})/”,表示四位数字,每一个数字都是0到9的任意数字。
- 提取参数:命名形式为“(?P<name>pattern)”,比如“re_path(articles/(?p<year>[0-9]{4}))/”,将正则表达式提取的四位数字,每一个数字都是0到9的任意数字命名为year。
注意:当网站功能较多时,可以在该功能文件夹里建一个urls.py文件,将该功能模块下的URL全部写在该文件里,但是要在全局的urls.py中使用include方法实现URL映射分发。
编写URL的三种情况如下:
- 普通URL:re_path('^index/',view.index),re_path('^home/',view.Home.as_view())
- 顺序传参:re_path(r'^detail-(\d+)-(\d+).html/',views.detail)
- 关键字传参:re_path(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html/',views.detail)
推荐使用关键字传参的路由方法,找到项目根目录的配置文件夹demo下面的urls.py,打开该文件,并添加如下代码:
from django.contrib import admin # 引入默认后台的模块,其中包括管理界面的urls路由规则 from django.urls import path, include # 引入urls模块中path方法 urlpatterns = [ path('admin/', admin.site.urls), path('app1/',include('app1.urls')) ]
然后在app1下面创建一个urls.py文件,并在其中编写属于这个模块的url规则:
from app1 import views as app1_views urlpatterns = [ # 精确匹配视图 path('articles/2003/', app1_views.special_case_2003), # 匹配一个整数 path('articles/<int:year>/', app1_views.year_archive), # 匹配两个位置的整数 path('articles/<int:year>/<int:month>/', app1_views.month_archive), # 匹配两个位置的整数和一个slug类型的字符串 path('articles/<int:year>/<int:month>/<slug:slug>/', app1_views.article_detail), ]
如果想使用正则表达式匹配,则使用下面代码:
from django.urls import re_path from app1 import views as views urlpatterns = [ # 精确匹配 path('articles/2003/', views.special_case_2003), # 按照正则表达式匹配4位数字年份 re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # 按照正则表达式匹配4位数字年份和2位数字月份 re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # 按照正则表达式匹配4位数字年份和2位数字月份和一个至少1位的slug类型的字符串 re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail), ]
在对应的app1下的views中添加如下代码测试。
from django.http import HttpResponse from django.shortcuts import render # Create your views here. def articles(request): return HttpResponse("hello world!") # 返回数据
接下来即可通过“/app1/articles/2003/12/11/my_day”访问app1_views.article_detail这个视图方法了,效果如图25所示。
图25 访问视图方法
7、表单(forms)
在app1文件夹下创建一个forms.py文件,添加如下类代码:
from django import forms class PersonForm(forms.Form): first_name = forms.CharField(label='你的名字', max_length=20) last_name = forms.CharField(label='你的姓氏', max_length=20)
上面定义了一个PersonForm表单类,两个字段类型为forms.CharField,类似于models.CharField,first_name指字段的label为你的名字,并且指定该字段最大长度为20个字符。max_length参数可以指定forms.CharField的验证长度。
PersonForm类将呈现为下面的html代码:
<label for="你的名字">你的名字: </label> <input id="first_name" type="text" name="first_name" maxlength="20" required /> <label for="你的姓氏">你的姓氏: </label> <input id="last_name" type="text" name="last_name" maxlength="20" required />
表单类forms.Form有一个is_valid()方法,可以在views.py中验证提交的表单是否符合规则。对于提交的内容,在views.py编写如下代码:
from django.shortcuts import render from django.http import HttpResponse, HttpResponseRedirect from app1.forms import PersonForm def get_name(request): # 判断请求方法是否为POST if request.method == 'POST': # 将请求数据填充到PersonForm实例中 form = PersonForm(request.POST) # 判断form是否为有效表单 if form.is_valid(): # 使用form.cleaned_data获取请求的数据 first_name = form.cleaned_data['first_name'] last_name = form.cleaned_data['last_name'] # 响应拼接后的字符串 return HttpResponse(first_name + '' + last_name) else: return HttpResponseRedirect('/error/') # 请求为GET方法 else: return render(request, 'name.html', {'form': PersonForm()})
在html文件中使用返回的表单的代码如下:
<form action="/app1/get_name" method="post"> {% csrf_token %} {{ form }} <button type="submit">提交</button> </form>
{{form}}是Django模板的语法,用来获取页面返回的数据,这个数据是一个PersonForm实例,所以Django就按照规则渲染表单。
注意:渲染的表单只是表单的字段如上面PersonForm呈现的HTML代码,所以我们要在HTML中手动输入“<form></form>”标签,并指出需要提交的路由“/app1/get_name”和请求的方法post。并且,<form>标签的后面需要加上Django的防止跨站请求伪造模板标签{% csrf_token %}。简单的一个标签,就很好地解决了form表单提交出现跨站请求伪造攻击的情况。
添加URL到创建的app1/urls.py中,代码如下:
path('get_name', app1_views.get_name)
此时访问页面“http://127.0.0.1:8000/app1/get_name”,效果如图26所示。
图26 在Django项目中创建表单
8、视图(views)
下面通过一个例子讲解在Django项目中定义视图,代码如下:
from django.http import HttpResponse # 导入响应对象 import datetime # 导入时间模块 def current_datetime(request): # 定义一个视图方法,必须带有请求对象作为参数 now = datetime.datetime.now() # 请求的时间 html = "<html><body>It is now %s.</body></html>" % now # 生成HTML代码 return HttpResponse(html) # 将响应对象返回,数据为生成的HTML代码
上面的代码定义了一个函数,返回了一个HttpResponse对象,这就是Django的FBV(Function-Based View)基于函数的视图。每个视图函数都要有一个HttpRequest对象作为参数,用来接收来自客户端的请求,并且必须返回一个HttpResponse对象,作为响应给客户端。
django.http模块下有诸多继承于HttpReponse的对象,其中大部分在开发中都可以利用到。例如,我们想在查询不到数据时,给客户端一个HTTP 404的错误页面。可以利用django.http下面的Http404对象,代码如下:
from django.shortcuts import render from django.http import HttpResponse, HttpResponseRedirect, Http404 from app1.forms import PersonForm from app1.models import Person def person_detail(request, pk): # url参数pk try: p = Person.objects.get(pk=pk) # 获取Person数据 except Person.DoesNotExist: raise Http404('Person Does Not Exist') # 获取不到抛出Http404错误页面 return render(request, 'person_detail.html', {'person': p}) # 返回详细信息视图
在浏览器输入地址“http://127.0.0.1:8000/app1/person_detail/100/”,会抛出异常,效果如图27所示。
图27 定义HTTP 404错误页面
下面讲解一个基于类的视图实例(CBV),基于类的视图非常简单,与基于函数的视图大同小异。首先定义一个类视图,这个类视图需要继承一个基础的类视图,所有的类视图都继承自views.View。类视图的初始化参数需要给出。将上一小节定义的get_name()方法改成基于类的视图,代码如下:
from django.shortcuts import render from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.views import View from app1.forms import PersonForm from app1.models import Person class PersonFormView(View): form_class = PersonForm # 定义表单类 initial = {'key': 'value'} # 定义表单初始化展示参数 template_name = 'name.html' # 定义渲染的模板 def get(self, request, *args, **kwargs): # 定义GET请求的方法 # 渲染表单 return render(request, self.template_name, {'form': self.form_class(initial=self.initial)}) def post(self, request, *args, **kwargs): # 定义POST请求的方法 form = self.form_class(request.POST) # 填充表单实例 if form.is_valid(): # 判断请求是否有效 # 使用form.cleaned_data获取请求的数据 first_name = form.cleaned_data['first_name'] last_name = form.cleaned_data['last_name'] # 响应拼接后的字符串 return HttpResponse(first_name + '' + last_name) # 返回拼接的字符串 return render(request, self.template_name, {'form': form}) # 如果表单无效,返回表单
接下来定义一个URL,代码如下:
from django.urls import path from app1 import views as app1_views urlpatterns = [ path('get_name', app1_views.get_name), path('get_name1', app1_views.PersonFormView.as_view()), path('person_detail/<int:pk>/', app1_views.person_detail), ]
说明:form_class是指定类使用的表单,template_name是指定视图渲染的模板。
在浏览器中请求“/app1/get_name1”,会调用PersonFormViews视图的方法,如图28所示。
图28 请求定义的视图
输入“hugo”和“zhang”,并单击“提交”按钮,效果如图29所示。
图29 请求视图结果
9、Django模板
Django指定的模板引擎在settings.py文件中定义,代码如下:
TEMPLATES = [{ # 模板引擎,默认为Django模板 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], # 模板所在的目录 'APP_DIRS': True, # 是否启用APP目录 'OPTIONS': { }, }, ]
下面通过一个简单的例子,介绍如何使用模板,代码如下:
{% extends "base_generic.html" %} {% block title %}{{ section.title }}{% endblock %} {% block content %} <h1>{{ section.title }}</h1> {% for story in story_list %} <h2> <a href="{{ story.get_absolute_url }}"> {{ story.headline|upper }} </a> </h2> <p>{{ story.tease|truncatewords:"100" }}</p> {% endfor %} {% endblock %}
Django模板引擎使用“{%%}”来描述Python语句区别于<HTML>标签,使用“{{}}”来描述Python变量。上面代码中的标签及说明如表7所示。
表7 Django模板引擎中的标签及说明
标 签 |
说 明 |
{% extends 'base_generic.html'%} |
扩展一个母模板 |
{%block title%} |
指定母模板中的一段代码块,此处为title,在母模板中定义title代码块,可以在子模板中重写该代码块。block标签必须是封闭的,要由“{% endblock %}”结尾 |
{{section.title}} |
获取变量的值 |
{% for story in story_list %}、{% endfor %} |
和Python中的for循环用法相似,必须是封闭的 |
Django模板的过滤器非常实用,用来将返回的变量值做一些特殊处理,常用的过滤器如下:
- {{value|default:"nothing"}}:用来指定默认值。
- {{value|length}}:用来计算返回的列表或者字符串长度。
- {{value|filesizeformat}}:用来将数字转换成人类可读的文件大小,如:13KB,128MB等。
- {{value|truncatewords:30}}:获取返回的字符串的长度,此处为30个字符。
- {{value|lower}}:用于将返回的数据转换为小写字母。