创建你的第一个Django应用
让我们通过一个实例来学习。
通过这个教程,我们将会带你过一遍创建一个基本的投票应用的创建。
这个教程包含了两个部分 :
- 一个可以让用户在上面查看投票结果和投票的公共网站。
- 一个可以增加,修改,删除投票结果的后台管理网站。
我们假定你已经安装了Django,你可以通过运行下面的shell命令来区分django是否已经成功安装。
mac osx/Linux:
$ python -m django --version
windows:
/> py -m django --version
如果Django被安装了的话,你可以在shell中看到你安装django的版本。如果没有版本信息而是报错“No module named django”,说明没有成功安装。
这个教程使用了Django2.1版本,支持python3.5以上的版本。如果django的版本不匹配,你需要切换django的版本,找到对应版本的教程,在屏幕的右下角。

或者把django升级到最新版本。如果你使用了更老版本的python,请查看 What Python version can I use with Django?来寻找和Django匹配的python版本。
查看 How to install Django
来指导你如何删除旧版本的Django并安装新的版本。
哪里可以获取帮助
如果你在学习这个教程遇到问题时,可以发送email给django-users或者访问django on irc.freenode.net和其他django愿意帮助你的开发者讨论。
创建项目
如果这是你第一次使用django,你需要注意一些初始化的设置。换句话说,创建项目时会自动生成一些代码-Django实例的设置的集合,包括数据库配置,Django特定的配置,应用特定的配置。
来到命令行,cd到你要创建项目的文件夹,然后运行下面的命令。
mac/Linux
django-admin startproject mysite
windows:
django-admin startproject mysite
这将会在你当前的目录下创建一个mysite文件夹,如果这一步出错了,请看 Problems running django-admin.
注意
你需要避免给项目命名为Python或者Django组件的名字,特别是,这意味着你应该避免使用像“django”(这将会和django本身冲突)或者“test”(这将会和python内置的包冲突)这样的项目名称。
这些代码应该放在哪里?
如果你的后端是PHP(没有使用流行的框架),你应该把代码放在web服务器的根目录下(类似于/var/www)。使用Django时你不必这么做,把python代码放到web服务器根目录并不是一个好办法,这会有一定的风险让用户在web浏览器里看到你的代码,这对安全是不利的。
应该把代码放到根目录意外的文件夹,比如/home/mycode。
让我们来看一下startproject命令创建了什么:

这些文件分别是:
- 外层的mysite是根目录,它仅仅是项目的一个容器。它的名字和Django没有关系。你可以重命名为任何你喜欢的名字。
- manage.py: 一个可以通过命令行来实现和Django应用多种交互方式的文件。你可以阅读所有有关manage.py的细节在django-admin and manage.py中。
- 内层的mysite目录:是项目实际的python模块,它的名字就是python模块的名字,你需要使用import来导入里面的东西,比如mysite.urls
- mysite/init.py: 是一个空文件,这会让python认为这个目录是一个Python模块。如果你是一个Python初学者,阅读一下Python官方文档中的more about packages
- mysite/settings.py: 用来配置Django项目, Django settings将会告诉你如何设置使其工作。
- mysite/urls.py: 声明了Django项目的URL,是一个django驱动所网站的列表。你可以阅读更多关于URLs在URL dispatcher.
- mysite/wsgi.py: 一个WSGI兼容的web服务器提供服务来启动项目的入口。
开发者服务器
让我们确认你的Django项目是否可以工作。切换到外层的mysite目录,如果你还没准备好,并且运行了下面的命令.
mac/Linux:
python manage.py runserver
windows:
py manage.py runserver
你会在命令行中看到下面的输出:

注意
现在需要忽略unapplied database migrations的警告,我们稍后会处理数据库。
你已经开启了Django开发服务器,一个用纯python写的轻量级web服务器。我们把它放到了Django中,以便你能快速的开发应用,直到你发布到生产环境之前,就不用你再去处理生产服务器的配置问题了-例如Apache。
现在需要留意:不要应用这个web服务器到任何生产环境。它只能用于开发环境。(我们的任务是打造web框架,而不是服务器)。
现在,服务器已经运行起来了,在浏览器中访问http://127.0.0.1:8000/,你将会看到一个“恭喜”界面,一个火箭起飞的图标,It worked!
修改端口号
默认情况下,runserver命令会在内部会换地址的8000端口启动开发服务器。
如果你想修改服务器的端口号,像参数一样传递给命令行,例如, 这个命令就会8080端口启动服务器。
python manage.py runserver 8080
如果你想修改服务器的ip,和端口号一起传递进去,例如,监听所有公网的IP地址(在你运行Vagrant或者在网络的其他电脑上展示你的页面时会很有用) :
python manage.py runserver 0:8080
0是0.0.0.0的简写,完成的开发者服务器文档可以在 runserver找到。
自动重载服务器
当被请求时,开发服务器会自动重载python代码。你不必在修改python代码后重启服务器来让修改见效。可是,像添加文件这样的操作不会触发重启,所以在这样的情况下你需要手动重启服务器。
创建投票应用
现在你的开发环境的项目已经建好了,你可以着手让它工作了。
你用Django建立的每个应用都会遵循约定,包含一个python模块。django会自动生成基本的目录结构,所以你可以专注于代码,而非创建目录。
项目和应用
项目和应用之间有什么不同呢?应用是一个像博客,数据库的记录或者一个简单的投票应用程序。项目是配置和多个应用程序的集合,一个项目可以包含多个应用,一个应用也能被包含在多个项目中。
你的应用可以放在Python path的任何地方,在这个教程中,我们会把投票应用创建在manage.py的旁边,这样就能像顶级模块一样被导入了,而不是mysite的一个子模块。
为了创建你的应用,请确保和你的manage.py在同一级目录,并输入如下命令:
$ python manage.py startapp polls
这会创建一个polls目录,结构就像这样:

这个目录结构就是投票应用所在的地方。
创建你的第一个视图
让我们写第一个视图吧,打开poll/views.py文件,并把下面的python代码放进去。

这可能是Django中最简单的视图了,为了能调用视图,我们需要把他映射到一个URL上,并且我们需要一个URLconf。
为了在投票应用中创建URLconf,创建urls.py文件,你的应用目录开起来是这样的:

poll/urls.py文件包含了如下代码:

下一步,是在polls.urls模块指向根URLconf。在mysite/urls.py中,导入django.urls.include,并把include函数插入到urlpatterns列表中,代码如下:

include方法允许引用其他的URLconf,当django遇上include函数时,它砍断指向其他url的链接,并发送剩余的字符串到URLconf做进一步处理。
include函数的想法是,制造简单的“即插即用”的URL。所以,polls在他自己的URLconf中(polls/urls.py),它可以被'/polls/'取代,也可以是'/fun_polls/',还可以是'/content/polls/',或者其他路径,这个应用都会正常工作。
什么时候使用include函数?
当你包含了其他的URL模式时,你应该总是使用include函数。admin.site.urls是唯一的例外。
你已经在URLconf中连线了一个index视图,让我们确认一下它能否正常工作,运行如下代码:
python manage.py runserver
在浏览器中打开 http://localhost:8000/polls/,你应该能看到你在index视图中定义的文本“Hello, world. You’re at the polls index.”。
页面未找到?
如果你的页面报错了,检查浏览器的url,确保是 http://localhost:8000/polls/,而不是http://localhost:8000/。
path()函数被传递了4个参数,两个是必须的:route,view。还有两个可选参数,kwargs,name。此时此刻,是时候回顾一下这些参数都是什么了。
path() argument: route
route是包含url模式的一个字符串。当处理一个请求时,django以url模式中的第一个部分开始,沿着urlpatterns列表向下,并逐个和请求的url进行对比,直到找到一个匹配的。
模式并不搜索GET和POST参数,或者域名。例如,一个到https://www.example.com/myapp/的请求,URLconf将会查找myapp/。一个到https://www.example.com/myapp/?page=3的请求,URLconf还是只会查找myapp/
path() argument: view
当django发现了匹配的url模式时,它调用了一个以HTTPResponse为第一个参数的特殊视图函数,并且从路由中被捕获的值会作为关键字参数。我们一会儿会给出一个例子。
path() argument: kwargs
可以将任意的关键字参数以字典的形式传递到目标视图中,在这个教程中我们不打算使用django的这个特性。
path() argument:name
命名你的url,让它明确的指向任何地方,特别是模板。这个强大的特性允许你改变项目的全局url模式时,只需修改一个文件就好了。
当你了解了基本的请求相应流后,阅读part 2 of this tutorial来让数据库开始工作。