“全能”选手—Django 1.10文档中文版Part1

迎接大家看我的私有网站《刘江的博客和科目》:www.liujiangblog.com

最主要分享Python 及Django教程以及相关的博客


本文是博主翻译的Django1.10版本官方文档的第一部分,如时间充裕,争取一直翻译下,经验不足,或产生错漏,敬请指正。
除此以外对公开文档进行翻译的版权问题不是甚清楚,如有侵权请联系自身!

此外,要转载该系列翻译文章,也求联系博主。

老二组成部分传递门

其三有些传递门

季有传送门

3.2 模型和数据库Models and
databases

3.2.2 查询操作making
queries

3.3.8
会话sessions

目录

率先章、Django1.10文档组成结构
1.1 获取帮助
1.2 文档的集体形式
1.3 第一步
1.4 模型层
1.5 视图层
1.6 模板层
1.7 表单
1.8 开发流程
1.9 admin站点
1.10 安全性
1.11 国际化及本地化
1.12 性能与优化
1.13 Python兼容性
1.14 地理框架
1.15 常用WEB应用工具
1.16 其它核心职能
1.17 Django开源项目

第二章、起步
2.1 Django速览

  • 2.1.1 设计而的型model
  • 2.1.2 安装model
  • 2.1.3 使用API
  • 2.1.4 功能强大的动态admin后台管理界面
  • 2.1.5 设计而的路由系统URLs
  • 2.1.6 编写而的视图views
  • 2.1.7 设计而的模版
  • 2.1.8 总结

2.2 快速安装指南

  • 2.2.1 安装Python
  • 2.2.2 安装Django
  • 2.2.3 安装验证

2.3 第一独Django app,Part 1:请求和应

  • 2.3.1 创建project
  • 2.3.2 开发服务器development server
  • 2.3.3 创建投票程序(polls app)
  • 2.3.4 编写视图

2.4 第一个Django app,Part 2:模型和admin站点

  • 2.4.1 数据库安装
  • 2.4.2 创建模型models
  • 2.4.3 激活模型
  • 2.4.4 学会使用API
  • 2.4.5 Django admin站点介绍

第一回、Django1.10文档组成结构

1.1 获取帮助

得帮助的法门:

  • 参照第5.1节之FAQ,这里包含多普遍问题之答问
  • 探寻特定的音?尝试一下智能搜索、混合索引或者内容详细表
  • 每当10.2.1之DJango用户邮件列表中寻找信息或发布问题
  • 每当django的IRC频道咨询或者找IRC日志看看是不是早已生像样题材
  • 报告DJango中的bug

1.2 文档的组织形式

Django有许多文档,一个胜似层次之概览有助于你快找到想要的音信:

  • 入门教程:手把手的教会你创造一个WEB应用。如果你是个Django或者WEB应用开发者新手,从这边开上学是独对的抉择。也得优先看下面的“第一步”。
  • 主题向导:讨论一些比重大之主题和定义,属于较大的水准,提供有行之有效之背景音和释疑。
  • 参考指南:包含API的下指导与局部Django内核的其余地方。主要讲述Django是怎工作之,如何使她。学习就有的底前提是你需要对有的重点概念有核心的接头以及左右。
  • “怎么惩罚”向导:主要讨论一些重中之重之题材及使用状况。比入门教程更深刻,需要您针对Django的办事机制起得的垂询。

1.3 第一步

假使您是Django或程序员新手,那么从这里开始吧!

  • 从零开始:概览 | 安装
  • 入门教程:Part 1:请求与应 | Part 2:模型和admin站点 | Part
    3:视图和模板 | Part 4:表单和泛型 | Part 5:测试 | Part 6:静态文件
    | Part 7:自定制admin站点
  • 高级教程: 如何编写而选用的使 | 编写而的第一独Django补丁

1.4 模型层

Django提供了一个虚幻的模型层,用于集体同控制你的WEB应用数据。

  • 范:模型介绍 | 字段类型 | Meta选项 | 模型类
  • 查询结果集:执行查询 | 查询结果集艺术参考 | 查询表达式
  • 型实例: 实例方法 | 访问关系对象
  • 搬迁: 迁移介绍 | 操作参考 | 计划编制 | 编写迁移
  • 高等: 管理器 | 原生SQL | 事务 | 聚合 | 查找 | 自定义字段 | 多数据库
    | 自定义查询 | 查询表达式 | 条件表达式 | 数据库函数
  • 旁:支持的数据库 | 遗留数据库 | 提供初始化数据 | 优化数据库访问 |
    PostgreSQL特发出

1.5 视图层

Django将封装响应用户请求逻辑与归数据称“视图”。在底下的列表中,你能找到有和视图相关的内容:

  • 基础: 路由安排 | 视图函数 | 快捷方式 | 装饰器
  • 参照: 内置视图 | 请求/响应对象 | 模板响应对象
  • 文本上传: 概览 | 文件对象 | 储存API | 管理文件 | 自定义存储
  • 基类视图: 概览 | 内置显示视图 | 内置编辑视图 | 混合使用 | API参考 |
    分类索引
  • 高级: 生成CSV | 生成PDF
  • 中件:概览 | 内置中件类

1.6 模板层

模板层提供相同栽人性化的语法,用于渲染展示被用户之情节,主要内容囊括下列:

  • 基础:概览
  • 对于设计师:语言概览 | 内置标签和过滤器 | 人性化
  • 对程序员: 模板API | 自定义标签以及过滤器

1.7 表单

Django 提供了一个情丰富的框架而方便地创造表单及操作表单数据。

  • 基本功: 概览 | 表单 API | 内置字段 | 内置小器
  • 高档: 模型表单 | 表单外观 | 表单集 | 自定义说明

1.8 开发流程

学不同之零件和工具,帮助您开与测试Django应用。

  • 安:概览 | 全部装置列表
  • 应用: 概览
  • 异常:概览
  • Django-admin和manage.py:概览 | 添加起定义命令
  • 测试:介绍 | 编写和运转测试 | 导入测试工具 | 高级主题
  • 安排:概览 | WSGI服务器 | 部署静态文件 | 通过邮件跟踪代码错误

1.9 admin站点

以这里,你得找到Django中最让欢迎之功能模块——admin站点的方方面面:

  • admin站点
  • admin动作
  • admin文档生成器

1.10 安全性

付出 Web 应用时安全是极其要一个的主题,Django 提供了大多又保障工具与编制:

  • 平安概览
  • 披露的Django安全问题
  • 点击劫持的防止
  • 跨站请求伪造防护
  • 加密签定
  • 安中件

1.11 国际化及本地化

Django
提供了一个精锐的国际化及本地化框架,以拉您支支持多国语言及世界各地区之采用:

  • 纵观 | 国际化 |本地化 | 本地WEB UI 格式化和表单输入
  • 时区

1.12 性能和优化

有许技术与工具得以拉而的代码运行得进一步迅速、快速,占用更不见的系统资源。

  • 属性及优化概览

1.13 Python兼容性

Django 希望兼容多只例外特点和版本的 Python:

  • Jython支持
  • Python3 兼容性

1.14 地理框架

GeoDjango 想如果举行一个一流的地理Web框架。 它的目标是硬着头皮轻松的构建GIS
Web 应用以及表述空间数据的力。

1.15 常用WEB应用工具

Django 也付出Web应用提供了多广大的工具:

  • 身份验证:概览 | 使用验证系统 | 密码管理 | 自定义说明 | API参考
  • 缓存
  • 日志
  • 发送邮件
  • 一道供稿(RSS/Atom)
  • 分页
  • 消息框架
  • 序列化
  • 会话
  • 站点地图
  • 静态文件管理
  • 数说明

1.16 其它核心功能

Django的另外核心力量包括:

  • 按需处理内容
  • 情类型和泛型关系
  • 大概页面
  • 重定向
  • 信号
  • 网检查框架
  • 站点框架
  • 在 Django 中使用 Unicode

1.17 Django开源项目

下面是Django项目我的支出进程同什么做出贡献相关:

  • 社区: 如何介入 | 发布过程 | 团队组织 | 团队会议 | 第一人员 |
    源码仓库 | 安全策略 | 邮件列表
  • 计划意见: 概述
  • 文档: 关于本文档
  • 老三着发行: 概述
  • Django 的病逝: API 稳定性 | 发行说明与升级说明 | 功能弃用时间轴

第二章、起步

2.1 Django速览

Django的开销背景是抢节奏的资讯编辑室环境,因此她叫规划成一个格外而全的web框架,能够快速简单的成功任务。本节用速介绍如何使用Django搭建一个数据库让的WEB应用。
它们不见面有极度多之技术细节,只是为您明白Django是何等行事之。

2.1.1 设计而的模型model

Django提供了ORM,通过它,你能一直采用Python代码来叙述您的数据库设计。下面是一个例子:

# mysite/news/models.py

from django.db import models

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)
    def __str__(self): # __unicode__ on Python 2
    return self.full_name
class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
    def __str__(self): # __unicode__ on Python 2
    return self.headline

2.1.2 安装model

连接下去,进入Django命令行工具,创建数量库表:
$ python manage.py migrate
migrate命令查找所有可用之model,如果它还从未当数据库被在,将根据model创建相应的申。注:也许你要先实行$ python manage.py makemigrations命令。

2.1.3 使用API

Django也汝提供了大气底造福的数据库操作API,无需你编额外的代码。下面是个例证:

# Import the models we created from our "news" app
>>> from news.models import Reporter, Article
# No reporters are in the system yet.
>>> Reporter.objects.all()
<QuerySet []>
# Create a new Reporter.
>>> r = Reporter(full_name='John Smith')
# Save the object into the database. You have to call save() explicitly.
>>> r.save()
# Now it has an ID.
>>> r.id
1
# Now the new reporter is in the database.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>
# Fields are represented as attributes on the Python object.
>>> r.full_name
'John Smith'
# Django provides a rich database lookup API.
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith='John')
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Reporter matching query does not exist.
# Create an article.
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
... content='Yeah.', reporter=r)
>>> a.save()
# Now the article is in the database.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>
# Article objects get API access to related Reporter objects.
>>> r = a.reporter
>>> r.full_name
'John Smith'
# And vice versa: Reporter objects get API access to Article objects.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>
# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>
# Change an object by altering its attributes and calling save().
>>> r.full_name = 'Billy Goat'
>>> r.save()
# Delete an object with delete().
>>> r.delete()

2.1.4 功能强大的动态admin后台管理界面

Django包含一个功能强大的admin后台管理模块,使用方便,要素齐全。有助于你飞开。你只需要以底下两独公文被形容几句短短的代码:
mysite/news/models.py

from django.db import models
class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

mysite/news/admin.py

from django.contrib import admin
from . import models

admin.site.register(models.Article)

2.1.5 设计而的路由系统URLs

Django主张干净、优雅的路由设计,不建议于路途由于被起类似.php或.asp之类的词。

路由都写在URLconf文件被,它白手起家于URL匹配模式和python毁掉函数之间的投,起及了解耦的用意。下面是一个例证:
mysite/news/urls.py

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

Django通过正则表达式,分析看请求的url地址,匹配相应的views,调用对应之函数。

2.1.6 编写而的视图views

各个一个视图都必做下两件工作之一:返回一个分包呼吁页面数据的HttoResponse对象要弹有一个接近404页面的良。

一般说来,视图通过参数获取数据,并行使它渲染加载的沙盘。下面是一个例证:
mysite/news/views.py

from django.shortcuts import render
from .models import Article
def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    context = {'year': year, 'article_list': a_list}
    return render(request, 'news/year_archive.html', context)

2.1.7 设计而的模版

Django有一个模板查找路径,在settings文件中,你可以指定路线列表,Django自动按顺序以列表中搜索你调用的模板。一个模板看起是下边这样的:
mysite/news/templates/news/year_archive.html

{% extends "base.html" %}
{% block title %}Articles for {{ year }}{% endblock %}
{% block content %}
<h1>Articles for {{ year }}</h1>
{% for article in article_list %}
<p>{{ article.headline }}</p>
<p>By {{ article.reporter.full_name }}</p>
<p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

Django使用自己之沙盘渲染语法,Jinja2哪怕是参照她设计下的。双大括哀号包含起来的是变量,它以吃现实的值替换。圆点不但可以用来询问属性,也得以就此来调动用字典键值,列表索引和调用函数。
Django具有模板继承、导入和加载的概念,分别使用extend、include和load语法。下面是一个基础模板盖的师:
mysite/templates/base.html

{% load static %}
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<img src="{% static "images/sitelogo.png" %}" alt="Logo" />
{% block content %}{% endblock %}
</body>
</html>

子模板继承母模板的情节,并投入自己独有的有的。通过更换母版,可以快速的修改整改站点的外观和体裁。

2.1.8 总结

Django为卿提供了大量之模块和组件,包括模板系统、模型系统、视图系统和其他有通用组件和专用组件。他们中还是独自的,同时为是可选的,你一点一滴可使自己之沙盘、模型、视图。但是,Django给您提供的凡一个集成度高的大效率整体框架,如果你自己之水平不是杀高,那建议要采取Django提供的吧。

2.2 快速安装指南

以第三段的第一节约有详细的安装指南,这里就是一个简练的设置向导,用于快速搭建环境入下的章节。

2.2.1 安装Python

Django与python版本的呼应关系。

Django version Python versions
1.8 2.7, 3.2 (until the end of 2016), 3.3, 3.4, 3.5
1.9, 1.10 2.7, 3.4, 3.5
1.11 2.7, 3.4, 3.5, 3.6
2.0 3.5+

请前往Python官网下载并设置python。
另外,python和Django自带轻量级数据库SQLite3,因此,在求学阶段你随便需安装并配备外的数据库。

2.2.2 安装Django

使您是经过提升的办法安装Django,那么您得先卸载旧的本子,具体查看3.1.4节。
你可以经过下的3种方法安装Django:

  • 设置你的操作系统提供的发行本
  • 安装官方版(推荐)
  • 设置开发版本

此处,请赴Django官网下载最新版本要通过pip3 install django进行设置。

脚是Django官方对版本的支撑政策:


若就是未来宣布版的门道图:

2.2.3 安装验证

跻身python环境,输入下列命令,注意版本号和公初安装的同等:

>>> import django
>>> print(django.get_version())
1.10

要利用命令$ python -m django --version查阅版本号。

下面,我们拿上官方文档提供的编排第一个Django app教程!

2.3 第一只Django app,Part 1:请求和响应

每当是事例中,我们以编辑一个问卷调查网站,它富含下面两片段:

  • 一个可以叫众人进行投票和查看结果的公然站点
  • 一个被您可以进行增删改查的后台admin管理界面

按照学科使用Django 1.10 及Python 3.4之上版本!

2.3.1 创建project

进去你指定的有目录,运行下面的指令:
$ django-admin startproject mysite
旋即将在目录下生成一个mysite目录,也即是若的这个Django项目之根本目录。它含有了平多重自动生成的目和文书,具备各自专有的用途。注意:在受品种命名的时刻必须避开Django和Python的保存重要字,比如“django”,“test”等,否则会滋生冲突和莫名的一无是处。对于mysite的放位置,不建议坐落传统的/var/wwww目录下,它会有着自然的数据暴露危险,因此Django建议你以项目文件在例如/home/mycode类似的职位。
一个初确立之种组织大体上如下:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

详细解释:

  • 外层的mysite/目录与Django无关,只是你种之器皿,可以任意命名。
  • manage.py:一个命令行工具,用于与Django进行不同方法的互脚本,非常主要!
  • 内层的mysite/目录是实在的花色文件包目录,它的名字是您引用内部文件的包名,例如:mysite.urls。
  • mysite/init.py:一个定义包的空文件。
  • mysite/settings.py:项目的主配置文件,非常关键!
  • mysite/urls.py:路由于文件,所有的职责还是起此间开分配,相当给Django驱动站点的内容表格,非常主要!
  • mysite/wsgi.py:一个冲WSGI的web服务器进入点,提供底层的网络通信功能,通常并非关心。

2.3.2 开发服务器development server

进mystie目录,输入下面的命:
$ python manage.py runserver
而见面相下的提醒:

Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may not work properly until they are applied.
Run `python manage.py migrate' to apply them.
September 07, 2016 - 15:50:53
Django version 1.10, using settings `mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Django提供了一个用来支付的web服务器,使您管需安排一个类Ngnix的线上服务器,就能为站点运行起来。但你啊毫不以开发服务器用于生产条件,它不过是一个概括的测试服务器。
现,在浏览器访问http://127.0.0.1:8000/,你将看到Django的欢迎阴面,一切OK!
django开发服务器(以后大概)默认运行于其间的8000端口,如果您想指定,请以命令中展示为来,例如:
$ python manage.py runserver 0.0.0.0:8000
点:Django将运行于8000端口,整个子网内还将可看,而未是本机。
瞩目:
Django的开发服务器具有自动重载功能,当您的代码来改,每隔一段时间服务器将自动更新。但是,有一对如增加文件的动作,不会见硌服务器重载,这时就待您自己手动重开。

2.3.3 创建投票程序(polls app)

app与project的区别:

  • 一个app实现有意义,比如博客、公共档案数据库或者略的投票系统;
  • 一个project是布置文件以及多单app的会师,他们结合成整个站点;
  • 一个project可以分包多个app;
  • 一个app可以属于多只project!

app的存位置好是另外地点,但是一般咱们用她还在和manage.py同级目录下,这样有利于导入文本。

入mysite目录,确保与manage.py文件处于与一级,输入下述命令:
$ python manage.py startapp polls
网会自动生成 polls目录,其结构如下:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

2.3.4 编写视图

每当polls/views.py文件中,输入下列代码:

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

为调用该视图,我们尚待编制urlconf。现在,在polls目录中初砌一个文书,名字吧urls.py,在里面输入代码如下:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

产一致步是被项目的主urls文件对我们成立之polls这个app独有的urls文件,你得事先导入include模块,打开mysite/urls.py文件,代码如下:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]

include语法相当给二级路由于政策,它以收到到之url地址去除了她面前的正则表达式,将盈余的字符串传递让下一级路由于进行判断。在路由于的段,有越详细的用法指导。
include的潜是同一种即插即用的合计。项目根路由未体贴具体app的路由策略,只管于指定的二级路由于转发,实现了解耦的特性。app所属的二级路由于得以因自己之要自由编写,不见面与任何的app路由发生冲突。app目录可以停放于另位置,而休用修改路由于。这是软件设计里特别广阔的一样种植模式。
建议:除了admin路由外,你应有尽量让每个app设计自己单独的二级路由。

吓了,路由于为搭建成功,下面我们启动服务器,然后于浏览器被走访地址http://localhost:8000/polls/。一切正常的讲话,你以视“Hello,
world. You’re at the polls index.”

url()函数可以传递4单参数,其中2只是得的:regex和view,以及2个可挑选的参数:kwargs和name。下面是有血有肉的讲:

regex:
regex是正则表达式的通用缩写,它是同一种植匹配字符串或url地址的语法。Django将在用户要的url地址,在urls.py文件中对urlpatterns列表中的诸一样起条款从头开始进行逐项比,一旦遇见匹配项,立即施行该条目映射的视图函数或二级路由,其后的条目将不再继续配合。因此,url路由的编排顺序至关重要!

用留意的是,regex不见面去匹配GET或POST参数或域名,例如对于https://www.example.com/myapp/,regex只尝试匹配myapp/。对于https://www.example.com/myapp/?page=3,regex也只尝试匹配myapp/。

比方你想深入研讨正则表达式,可以读一些息息相关的书籍还是专论,但是于Django的实践着,你莫待差不多胜过深的正则表达式知识。

性能注释:正则表达式会展开先期编译当URLconf模块加载的时刻,因此它的匹配搜索速度杀抢,你习以为常感觉不交。

view:
当正则表达式匹配到有条目时,自动将包的HttpRequest对象作为第一只参数,正则表达式“捕获”到之价当次单参数,传递让该条目指定的视图。如果是大概捕获,那么捕获值将用作一个岗位参数进行传递,如果是命名捕获,那么将作重要字参数进行传递。

kwargs:
随便数量之严重性字参数可以当一个字典传递给目标视图。

name:
本着君的URL进行命名,可以于您能当Django的任意处,尤其是模板内显式地引用它。相当给给URL取了个全局变量名,你不过需要修改者全局变量的价,在周Django中引用它的地方啊用一律收获改观。这是颇为古老、朴素和中的规划思想,而且这种考虑无处不在。

2.4 第一个Django app,Part 2:模型和admin站点

接着上有,本节将讲述如何设置数据库,编写第一只模型与简要的介绍下Django自动生成的admin站点。

2.4.1 数据库安装

开拓mysite/settings.py配置文件。Django默认使用内置的SQLite数据库。当然,如果你是于创立一个其实的品类,请动类似MySql的生用数据库,避免下面临数据库切换的头疼。
设若您想利用别的数据库,请预安装相应的数据库模块,并拿settings文件中DATABASES
’default’的键值进行对应的修改,用于连接而的数据库。其中:

ENGINE(引擎):可以是’django.db.backends.sqlite3’或者’django.db.backends.postgresql’,’django.db.backends.mysql’,
or ’django.db.backends.oracle’,当然其它的也行。

NAME(名称):数据库的名。如果您采取的凡默认的SQLite,那么数据库将当一个文书拿存放于公的地方机械内,NAME应该是这个文件之完好绝对路径,包括文件称。设置中的默认值os.path.join(BASE_DIR,
’db.sqlite3’),将把该文件储存在您的花色目录下。

假定您莫是以默认的SQLite数据库,那么一些诸如USER,PASSWORD和HOST的参数必须手动指定!更多细节参考后续的数据库章节。

注意:

  • 以应用非SQLite的数据库时,请务必首先在数据库提示符交互模式下创造数据库,你可以使用命令:“CREATE
    DATABASE database_name;”。
  • 包您以settings文件中提供的数据库用户拥有开创数量库表的权位,因为于连片下去的课程被,我们得活动创建一个test数据库。
  • 如若您下的凡SQLite,那么您管需做其他预先布置,直接用就可以了。

于改settings文件时,请顺便用TIME_ZONE设置为公所当的时区。
并且,请小心settings文件中顶部的INSTALLED_APPS设置项。它保存了具备的在时项目受到于激活的Django应用。你必将公于定义之app注册于此处。每个应用得被多只类别采用,而且你得打包和分发给其他人在他们之路蒙行使。

默认情况,INSTALLED_APPS中见面自动包含下列条目,它们都是Django自动生成的:

  • django.contrib.admin:admin站点
  • django.contrib.auth:身份证明系统
  • django.contrib.contenttypes:内容类型框架
  • django.contrib.sessions:会话框架
  • django.contrib.messages:消息框架
  • django.contrib.staticfiles:静态文件管理框架

方的每个应用还至少用运用一个数额库表,所以在应用它前我们要以数据库中创造这些发明。使用此令:$
python manage.py migrate。

migrate命令将遍历INSTALLED_APPS设置中的享有类型,在数据库被开创对应的表,并打印出各个一样长长的动作信息。如果您感兴趣,可以在你的数据库命令行下输入:\dt
(PostgreSQL), SHOW TABLES; (MySQL), 或 .schema (SQLite) 来排有 Django
所创办的发明。

提示:对于极简主义者,你一点一滴可在INSTALLED_APPS内注释掉任何要全体底Django提供的通用应用。这样,migrate也非会见再创对应的数据表。

2.4.2 创建模型models

Django通过由定义python类的形式来定义具体的模型,每个模型代表数据库中的一样摆放表,每个接近的实例代表数量表中的一行数,类中之每个变量代表数量表中的同等排列字段。Django通过ORM对数据库进行操作,奉行代码优先的眼光,将python程序员和数据库管理员进行分工解耦。

于此大概的投票应用被,我们以创造两只模型:Question和Choice。Question包含一个题材跟一个发表日期。Choice包含两单字段:选择的文书以及投票计数。每一样长达Choice都关乎到同样长条Question。这些还是由于python的类似来体现,编写的净是python的代码,不碰任何sql语句。现在,编辑polls/models.py文件,具体代码如下:
polls/models.py

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

上面的代码非常简单明了。每一个看似都是django.db.models.Model的子类。每一个字段都是Field类的一个实例,例如用于保存字符数据的CharField和用来保存时档次的DateTimeField,它们告诉Django每一个字段保存之数据类型。

列一个 Field 实例的名字便是字段的名(如: question_text 或者
pub_date
)。在您的Python代码中见面使用这个价值,你的数据库也会拿之价值作为表底列名。

而吧足以以每个Field中以一个可选的率先岗位参数用于供一个生人可读的许段名,让您的范更温馨,更易于读,并且以被看成文档的同等有的来增强代码的可读性。在本例中,仅定义了一个切人类习惯的字段名Question.pub_date。对于范中的其他字段,机器名称即使曾经够用我们信服读了。

有的Field类必须提供一些特定的参数。例如CharField需要您指定max_length。这不但是数据库结构的急需,同样为用于我们后会谈及之数码说明功能。

发出早晚填参数,当然就是见面发出可选参数,比如当votes里我们以其默认值设为0.

最后请留意,我们使用ForeignKey定义了一个外键关系。它告诉Django,每一个Choice关联到一个遥相呼应的Question。Django支持通用的数涉嫌:一对一,多对同及多对多。

2.4.3 激活模型

点的代码看正在来硌少,但也与Django大量的音,据此,Django会做下两码事:

  • 创建该app对应的数码库表结构
  • 啊Question和Choice对象创建基于python的数据库访问API

不过,首先,我们得事先告诉项目,我们早已安装了投票应用。

Django思想:应用是“可插拔的”:你得于差不多独品种下一个动,你啊得分发以,它们不见面叫松绑到一个加的
Django 项目受到。

要是将使添加到项目中,需要以INSTALLED_APPS设置中增加对该使用之布局文件之链接。对于本例的投票应用,它的配置类文件是polls/apps.py,路径格式为’polls.apps.PollsConfig’。我们要在INSTALLED_APPS中,将该路线上加进去。它看起是这么的:

mysite/settings.py

INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

现在Django已经知道你的投票应用之有了,并拿其在了大家庭。我们再运行下一个命:$
python manage.py makemigrations polls。你会见到类似下面的唤醒:

Migrations for 'polls':
polls/migrations/0001_initial.py:
    - Create model Choice
    - Create model Question
    - Add field question to choice

经过运行migrations命令,相当给告诉Django你针对而的范有改动,并且你想把这些改动保存也一个“迁移”。

migrations是Django保存模型修改记录的文书,它们是保留于磁盘上的文本。在例子中,它便是polls/migrations/0001_initial.py文件,你得打开它看看,里面保存之还是只是编制的情节,方便而天天手动修改。

接下有一个称migrate的指令将本着数据库执行真正的搬迁动作,下面我们就要介绍其。但是,在此之前,让咱先行看看当migration的早晚其实试行的SQL语句是啊。有一个名为sqlmigrate的
命令可以展示sql语句,例如:

$ python manage.py sqlmigrate polls 0001

公用会见见到如下类似的公文(经过相当的格式调整,方便阅读):

BEGIN;
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
    "id" serial NOT NULL PRIMARY KEY,
    "choice_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL
);
--
-- Create model Question
--
CREATE TABLE "polls_question" (
    "id" serial NOT NULL PRIMARY KEY,
    "question_text" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
--
-- Add field question to choice
--
ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL;
ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT;
CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
ALTER TABLE "polls_choice"
    ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id"
    FOREIGN KEY ("question_id")
    REFERENCES "polls_question" ("id")
    DEFERRABLE INITIALLY DEFERRED;
COMMIT;

请注意:

  • 实在的输出内容将取决于你运的数据库会迥然不同。上面的是PostgreSQL的出口。
  • 表名是自动生成的,通过做使用名 (polls) 和题诗的模子名 – question
    和 choice 。 ( 你得还写这表现。)
  • 主键 (IDs) 是自行抬高的。( 你也可再写这个行为。)
  • 以老,Django 会在外键字段名及附加 “_id” 。
    (你仍然可再次写这个行为。)
  • 外键关系由FOREIGN
    KEY显示声明。不要担心DEFERRABLE部分,它就是语PostgreSQL不使执行外键直到工作了。
  • 生成 SQL
    语句时对你所下的数据库,会否卿活动处理特定于数据库的字段,例如
    auto_increment (MySQL), serial (PostgreSQL), 或integer primary key
    (SQLite) 。 在援字段名时也是如此 – 比如以对引号或单引号。
  • 这些 sql
    命令并较在公的数据库中其实运作,它只是在屏幕及展示出来,以便让你打探
    Django 真正实施之是啊。

如您感兴趣,也堪运行python manage.py
check命令,它将检查类受到有所没有起进展搬迁或者链接数据库的谬误。

现,我们得运作migrate命令,在数据库被开展真正的表操作了。

$ python manage.py migrate
Operations to perform:
    Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
    Rendering model states... DONE
    Applying polls.0001_initial... OK

migrate命令对富有还无执行之迁记录进行操作,本质上虽是将公对范的修改体现到数据库中现实的发明上面。Django通过一致张称django_migrations的申,记录并跟已经尽的migrate动作,通过对照获得怎样migrations尚未提交。

migrations的法力特别强大,允许你时刻修改你的模子,而不欲去或新建你的数据库或数据表,在匪丢数据的以,实时动态更新数据库。我们拿当后面的章对这展开深刻的论述,但是现在,我们一味需要记住修改模型时之操作分三步:

  • 于models.py中改模型
  • 运作python manage.py makemigrations为反创建迁移记录
  • 运行python manage.py migrate,将搬迁同步到数据库,落实修改动作。

因而要以开创同施行迁移的动作分成两独令两步走是因您或许如果经过版本控制系统(例如github,svn)提交你的色代码,如果没有一个中级过程的保存文件(migrations),那么github如何知道与记录、同步、实施而所开展了之模型修改动作也?毕竟,github不跟数据库直接打交道,也没法和而本地的数据库打交道。但是分别之后,你唯有待用你的migration文件(例如地方的0001)上传到github,它便会懂得一切。

2.4.4 学会用API

脚,让我们进python交互环境,学习应用Django提供的数据库访问API。要跻身python的shell,请输入指令:
$ python manage.py shell

相互较一直输入“python”命令的艺术上python环境,调用manage.py参数能以DJANGO_SETTINGS_MODULE环境变量导入,它将机关按mysite/settings.py中的安,配置好您的python
shell环境,这样,你便可以导入和调用任何你色内的模块了。

或者你呢得以这么,先上一个纯粹的python
shell环境,然后启动Django,具体如下:

>>> import django
>>> django.setup()

比方上述操作出现AttributeError异常,有或是你正采取一个以及手上科目不配合的Django版本。解决办法是读书比较逊色版本的课程或转移更新版本的Django。

管是呀种方法,你最后都是叫python命令能找到正确的模块地址,得到不错的导入。

当您进来shell后,尝试一下底的API吧:

    >>> from polls.models import Question, Choice # 导入我们写的模型类
    # 现在系统内还没有questions
    >>> Question.objects.all()
    <QuerySet []>

    # 创建一个新的question
    # Django推荐使用timezone.now()代替python内置的datetime.datetime.now()
    from django.utils import timezone
    >>> q = Question(question_text="What's new?", pub_date=timezone.now())

    # 你必须显式的调用save()方法,才能将对象保存到数据库内
    >>> q.save()

    # 默认情况,你会自动获得一个自增的名为id的主键
    >>> q.id
    1

    # 通过python的属性调用方式,访问模型字段的值
    >>> q.question_text
    "What's new?"
    >>> q.pub_date
    datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

    # 通过修改属性来修改字段的值,然后显式的调用save方法进行保存。
    >>> q.question_text = "What's up?"
    >>> q.save()

    # objects.all() 用于查询数据库内的所有questions
    >>> Question.objects.all()
    <QuerySet [<Question: Question object>]>

此处当一下:上面的是一个不可读的情节展示,你无法从中得到其他直观的信息,为之我们需要一致接触多少技巧,让Django在打印对象时显示有咱指定的音讯。返回polls/models.py文件,修改一下question和Choice这简单独八九不离十,代码如下:

polls/models.py

from django.db import models
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible # 当你想支持python2版本的时候才需要这个装饰器
class Question(models.Model):
    # ...
    def __str__(self):   # 在python2版本中使用的是__unique__
        return self.question_text

@python_2_unicode_compatible 
class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

其一技术不但对您打印对象时颇有帮扶,在你以Django的admin站点时为一致发生协助。

呼吁留意,这些还是平凡的Python方法。下面我们从定义一个措施,作为示范:

polls/models.py

import datetime
from django.db import models
from django.utils import timezone

class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

告留心点分别导入了少只有关时间之模块,一个是python内置的datetime一个凡是Django工具包提供的timezone。

保留修改后,我们重开动一个初的python shell,再来探视其他的API:

>>> from polls.models import Question, Choice

# 先看看__str__()的效果,直观多了吧?
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

# Django提供了大量的关键字参数查询API
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>

# 获取今年发布的问卷
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

# 查询一个不存在的ID,会弹出异常
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.

# Django为主键查询提供了一个缩写:pk。下面的语句和Question.objects.get(id=1)效果一样.
>>> Question.objects.get(pk=1)
<Question: What's up?>

# 看看我们自定义的方法用起来怎么样
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

# 让我们试试主键查询
>>> q = Question.objects.get(pk=1)

# 显示所有与q对象有关系的choice集合,目前是空的,还没有任何关联对象。
>>> q.choice_set.all()
<QuerySet []>

# 创建3个choices.
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)

# Choice对象可通过API访问和他们关联的Question对象
>>> c.question
<Question: What's up?>

# 同样的,Question对象也可通过API访问关联的Choice对象
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3

# API会自动进行连表操作,通过双下划线分割关系对象。连表操作可以无限多级,一层一层的连接。
# 下面是查询所有的Choices,它所对应的Question的发布日期是今年。(重用了上面的current_year结果)
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

# 使用delete方法删除对象
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()

博更多关于模型关系的音信,请查看6.15.4章。更多之数据库API和什么以对产划线进行询问,请看3.2.2章节。

2.4.5 Django admin站点介绍

统筹意见:为而的社或客户编写用于充实、修改及去内容之admin站点是一模一样件非常枯燥的做事同时没有小创造性。因此,Django自动地也汝通过模型构造了一个admin站点。这个站点只有叫站点管理员使用,并无针对民众开放。

  • 创办管理员用户

率先,通过下面的吩咐,创建一个足登录admin站点的用户:
$ python manage.py createsuperuser
输入用户称:
Username: admin
输入邮箱地址:
Email address: admin@example.com
输入密码:
Password: **********
Password (again): *********
Superuser created successfully.

小心:Django1.10版本后,超级用户的密码强制要求有所一定之复杂,不能够再偷懒了。

  • 起步开发服务器

服务器启动后,在浏览器访问http://127.0.0.1:8000/admin/。你就能看到admin的登陆界面了:

  • 进入admin站点

行使刚才确立之admin账户,登陆站点,你用张如下的界面:

眼下一度发些许单可编制的情节:groups和users。它们是django.contrib.auth模块提供的身份验证框架。

  • 每当admin中登记你的投票应用

现在而还无法观你的投票应用,必须事先在admin中展开登记,告诉admin站点,请以poll的模型在站点外,接受站点的管住。

开辟polls/admin.py文件,加入下面的内容:

polls/admin.py

from django.contrib import admin
from .models import Question

admin.site.register(Question)
  • 浏览admin站点的功用

报question模型后,刷新admin页面就可知看到Question栏目了。

点击“Questions”,进入questions的改动列表页面。这个页面会显示所有的数据库内的questions对象,你可以以这边对它们进行修改。看到底的“What’s
up?”了么?它就是咱原先创建的一个question,并且通过__str__道的佑助,显示了比较直观的信息,而非是一个淡的靶子类型名称。

下,点击What’s up?进入编辑界面:

此地用留意的是:

  • 表单是由Question模型自动生成的
  • 不同的模型字段类型(DateTimeField, CharField)会表现呢不同的HTML
    input框类型。
  • 列一个DateTimeField都见面获取一个JS缩写。日期的缩写是Today,并有一个日历弹出框;时间之缩写是Now,并产生一个通用的日子输入列表框。

于页面的底,则是有些可是选按钮:

  • delete:弹出一个删减确认页面
  • save and add
    another:保存时改,并加载一个新的空白的此时此刻色对象的表单。
  • save and continue
    editing:保存时改,并重复加载该对象的编写页面。
  • save:保存修改,返回时目标类型的列表页面。

只要“Date
published”字段的值与汝于前边教程创建它的时光不一致,可能是你未曾对的配置TIME_ZONE,在境内,通常是8单小时的时间差异。修改TIME_ZONE配置并更加载页面,就可知亮对的日子了。

当页面的右手上比赛,点击“History”按钮,你见面视你针对当前目标的所有修改操作都在这里发生记录,包括修改时及操作人,如下图所示:

顶之,你针对范API和admin站点有矣必然的习,可以进入下一阶段的教程了。

觉得还行就点赞支持一下吧!

网站地图xml地图