“全能”选手—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官方对版本的支撑政策:
图片 1
图片 2
而这是前景公告版本的途径图:
图片 3

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类的一个实例,例如用于保存字符数据的Char菲尔德(Field)和用于保存时间档次的Date提姆(Tim)eField,它们告诉Django每一个字段保存的数据类型。

每一个 菲尔德(Field) 实例的名字就是字段的名字(如: question_text 或者
pub_date
)。在您的Python代码中会使用那个值,你的数据库也会将以此值作为表的列名。

您也可以在每个Field中使用一个可选的率先职位参数用于提供一个生人可读的字段名,让您的模型更要好,更易读,并且将被看成文档的一有的来提升代码的可读性。在本例中,仅定义了一个契合人类习惯的字段名Question.pub_date。对于模型中的其他字段,机器名称就已经充足我们认读了。

一对Field(Field)类必须提供一些特定的参数。例如Char菲尔德(Field)需要您指定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的登陆界面了:

图片 4

  • 进入admin站点

拔取刚才确立的admin账户,登陆站点,你将见到如下的界面:

图片 5

此时此刻一度有两个可编制的始末: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栏目了。

图片 6

点击“Questions”,进入questions的改动列表页面。这几个页面会展现所有的数据库内的questions对象,你可以在这边对它们举办改动。看到下边的“What’s
up?”了么?它就是大家从前创建的一个question,并且经过__str__办法的相助,展现了比较直观的信息,而不是一个淡然的对象类型名称。

图片 7

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

图片 8

这边需要小心的是:

  • 表单是由Question模型自动生成的
  • 不同的模型字段类型(Date提姆(Tim)eField(Field), Char菲尔德(Field))会表现为不同的HTML
    input框类型。
  • 每一个Date提姆e菲尔德(Field)都会收获一个JS缩写。日期的缩写是Today,并有一个日历弹出框;时间的缩写是Now,并有一个通用的时日输入列表框。

在页面的最底层,则是部分可接纳按钮:

  • delete:弹出一个剔除确认页面
  • save and add
    another:保存当前修改,并加载一个新的空域的此时此刻项目对象的表单。
  • save and continue
    editing:保存当前涂改,不分相互新加载该对象的编撰页面。
  • save:保存修改,重返当前目的类型的列表页面。

倘诺“Date
published”字段的值和您在后面教程创立它的时候不相同,可能是您没有科学的配置TIME_ZONE,在境内,平常是8个刻钟的时间差距。修改TIME_ZONE配置同等对待新加载页面,就能显得正确的日子了。

在页面的右上角,点击“History”按钮,你会看出您对眼前目的的有所修改操作都在此处有记录,包括修改时间和操作人,如下图所示:

图片 9

到此,你对模型API和admin站点有了迟早的熟习,可以进来下一阶段的课程了。

认为还行就点赞补助一下吗!

网站地图xml地图