Django安装配置

目录 

  1. 安装Django Web框架 
  2. 创建一个Django项目 
  3. 创建APP 
  4. 数据模型(models) 
  5. 管理后台 
  6. 路由(urls) 
  7. 表单(forms) 
  8. 视图(views) 
  9. 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}}:用于将返回的数据转换为小写字母。

 返回顶部

posted @ 2019-11-13 09:10  pathping  阅读(185)  评论(0)    收藏  举报