Django是一个Web框架——一套用于帮助开发交互式网站的工具。Django可以响应网页请求,还能让你更轻松地读写数据库、管理用户等。html
开始编写一个名为“学习笔记”的Web应用程序,让用户可以记录感兴趣的主题,并在学习每一个主题的过程当中添加日志条目。“学习笔记”的主页对这个网站进行描述,并邀请用户注册或登陆。用户登陆后,就能够建立主题、添加新条目以及阅读既有的条目。python
File->New Project,设置以下
web
cmd
进入终端,cd到python安装的Script文件夹下,利用pip命令安装Django,或将python安装目录Script文件夹路径加入环境变量中,则可直接使用pip命令。pip install django
命令安装Django在Pycharm中新建的项目中,利用Terminal终端在虚拟环境下使用django-admin startproject project-name .
建立项目,注意命令后的点号,书上提到,忘记点号在部署应用程序时会遇到一些配置问题。忘记点号,就将建立的目录文件夹删除再运行一边命令正则表达式
Django在项目中新建了一个名为learnning_log的目录,其中最重要的是settings.py、urls,py、wsgi.pysql
还建立了一个名为manage.py的文件,这是一个简单的程序,它接受命令并将其交给Django的相关部分去运行。咱们将使用这些命令来管理诸如使用数据库和运行服务器等任务shell
使用migrate
命令建立一个供Django使用的数据库:python manage.py migrate
数据库
咱们将修改数据库称为迁移数据库。首次执行命令migrate时,将让Django确保数据库与项目的当前状态匹配。在使用SQLite的新项目中首次执行这个命令时,Django将建立一个数据库django
运行过命令后,咱们会发现,项目中多出来了一个db.sqlite3文件,SQLite是一种使用单个文件的数据库,是编写简单应用程序的理想选择,由于它让你不用太关注数据库管理的问题浏览器
执行命令runserver,合适Django是否正确地建立了项目:python manage.py runserver
服务器
Django启动一个服务器,让你可以查看系统中地项目,了解他们地工做。当浏览器中输入url请求网页时,该Django服务器将进行响应:生成合适地网页,并将其发送给浏览器
注意 若是出现错误消息 “That portis already iin use"(指定端口已被占用),请执行
python manage.py runserver 8001
,让Django使用另外一个端口;若是这个端口也不可用,请不断执行上述命令,更改其中指定的端口号,直到找到可用的端口。
Django项目由一系列应用程序组成,它们协同工做,让项目成为一个总体。我接下来建立一个应用程序,他将完成项目的大部分工做。
当前,在前面打开的终端窗口运行着runserver
。咱们再打开一个终端窗口,执行命令startapp
命令startapp appname让Django创建建立应用程序的基础设施。如今查看项目目录,新增了一个文件夹learning_logs
该文件夹中最重要的文件是models.py、admin.py、views.py
接下来使用models.py来定义咱们在应用程序中管理的数据
咱们考虑设计的数据。每位用户在学习笔记中须要建立不少主题。用户输入每一个条目都与特定主题相关联,这些条目以文本的形式显示。咱们还须要存储每一个条目的时间戳,以便可以告诉用户各个条目都是何时建立的
打开models.py,它为咱们导入了模块models,咱们还能建立本身的模型。模型告诉Django如何处理应用程序中存储的数据。如今咱们建立一个名为Topic的类,继承Model,表示用户将存储的主题的模型,它包含text和date_added两个属性
要使用模型,必须让Django将应用程序包含到项目中,为此应该在settings.py中的INSTALLED_APPS片断中添加咱们的应用程序信息
接下来,须要让Django修改数据库,使其可以存储与模型Topic相关的信息。为此,在终端窗口执行makemigrations
命令让Django肯定该如何修改数据库,执行后Django将建立一个迁移文件在数据库中为模型Topic建立一个表
下面,使用migrate
来应用这种迁移,让Django替咱们修改数据库
为应用程序定义模型时,Django提供的管理网站admin site让咱们可以轻松地处理模型。接下来,咱们就创建管理网站,并经过它使用模型Topic来添加一些主题
建立超级用户:
执行python manage.py createsuperuser
命令在Django中建立超级用户,执行命令后,Django提示输入超级用户的用户名(默认)、邮箱(可放空)、密码、确认密码
向管理网站注册模型:
在models.py所在目录中的admin.py文件中输入下面代码向管理网站注册Topic
from learning_logs.models import Topic admin site.register(Topic)
如今使用超级用户帐户访问登陆网站:http://localhost:8000/admin/ ,输入刚建立的超级用户的用户名和密码,进入以下界面(Django administration)。这个网页能让咱们添加和修改用户和用户组,还能够管理刚才定义的模型Topic相关的数据,接下来,咱们来添加第一个主题
添加主题:
单击Topics进入主题网页,它几乎是空的,由于咱们尚未添加任何主题
单击Add,看到一个用于添加新主题的表单,在第一个输入框中输Chess,再单击Save,这将返回主题管理页面,其中刚建立的主题已被添加,按照该步骤咱们再建立一个Rock Climbing主题
特定主题下有用户在学习笔记记录的知识条目,这是一种多对一关系,即多个知识条目关联到同一个主题
像Topic同样,咱们建立Entry模型,它继承Django基类Model,拥有topic、text、date_added三个属性
迁移模型Entry:
因为咱们新添加了一个新模型,所以须要再次迁移数据库
这个过程是:
python manage.py makemigrations app_name
python manage.py migrate
生成了一个新的迁移文件,告诉Django如何修改数据库,使其能存储与模型Entry相关的信息,而后执行migrate,应用迁移
向管理网站注册Entry:
在admin.py中注册模型Entry
返回http://localhost:8000/admin/,你将看到learing_logs下列出了Entries,单击Entries的Add连接或单击Entries再选择Add entry。
你将看到一个下拉列表,能选择要建立哪一个主题的条目,还有一个输入条目的文本框。咱们添加一个Chess主题的条目,以下:
返回条目管理页面,咱们能看到添加的条目以及使用text[:50]呈现出来的条目信息
使用Django建立网页的过程一般分三个阶段:定义URL、编写视图和编写模板。首先,你必须定义URL模式。URL模式描述了URL是如何设计的,让Django知道如何将浏览器请求与网站URL匹配,以肯定返回哪一个网页。
每一个URL都被映射到特定的视图——视图函数获取并处理网页所需的数据。视图函数一般条用一个模板,后者生成浏览器可以理解的网页。咱们接下来建立学习笔记的主页。咱们将定义主页的URL、编写其视图函数并建立一个简单的模板
鉴于咱们只是要确保”学习笔记“按要求的那样工做,咱们将暂时让这个网页尽量简单。Web应用程序可以正常运行后,设置样式可以使其更有趣,但中看不中用的应用程序毫无心义。目前的主页只显示标题和简单的描述。
用户经过在浏览器中输入URL以及单击连接来请求网页,所以咱们须要肯定项目所需的URL。
当前,基础URL(http://localhost:8000/ )返回默认的Django网站,让咱们知道正确创建了项目。咱们将修改这一点,让这个基础URL映射到”学习笔记“的主页
首先,咱们修改项目文件夹中的urls.py
urls.py文件的urlpatterns主体包含了项目中的应用程序的URL。其中的admin.site.urls定义了可在管理网站中请求的全部URL
咱们添加了learning_logs.urls并包含namespace将learning_logs的URL同项目中的其余URL区分开来,这在项目扩展时颇有帮助
因此咱们又须要在文件夹learning_logs中建立另外一个urls.py文件:
在应用程序的urls.py中,咱们导入了url模块用于将URL映射到视图,还导入了views模块,其中的句点表示让Python从当前的urls.py模块所在的文件夹中导入视图。变量urlpatterns是一个包含了可在应用程序learning_logs中请求的网页
实际的URL模式是一个对函数url()
的调用,这个函数接受三个实参:
r'^$'
,其中的r
让Python将接下来的字符串视为原始字符串,引号包括正则表达式的起止。脱字符^
让Python查看字符串的开头,美圆符$
让Python查看字符串末尾视图函数接受请求中的信息,准备好生成网页所需的数据,再将这些数据发送给服务器
咱们在learning_logs应用程序的views.py中为主页编写视图,以下:
URL请求与咱们刚才定义的模式匹配时,Django将在文件views.py中查找函数index(),再将请求对象传递给这个视图函数。在这里,咱们不用处理任何数据,所以这个函数只调用render(),向它提供两个实参:原始请求对象以及一个用于建立网页的模板。接下来就是编写模板了
模板定义了网页的结构。模板定义了网页是什么样的,每当网页被请求时,Django将填入相关的数据。模板让你可以访问试图提供的任何数据。
咱们在learning_logs中新建一个文件夹,将其命名为templates,在templates中再建立一个learning_logs文件夹(这彷佛有些多余?但创建了Django可以明确解读的结构,即便项目很大,包含不少应用程序亦如此)。而后建立index.html文件,编写index.html代码
<p>Learning Log</p> <P>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>
如今,咱们再请求项目的基础URL——http://localhost:8000/ ,将看到刚才建立的网页,而不是默认的Django网页。Django接受请求的URL匹配了模式r'^$'
,所以调用函数views.index(),因而使用index.html包含的模板来渲染网页,结果以下
制定建立网页的流程后,能够开始扩充”学习笔记“的项目了。咱们将建立两个显示数据的网页,其中一个列出全部的主题,另外一个显示指定主题的全部条目。对于每一个网页咱们都将指定URL模式,编写一个视图函数,并编写一个模板。
建立网站时,几乎都有一些全部网页都将包含的元素。在这种状况下,能够编写一个包含通用元素的父模板,并让每一个网页都继承这个模板,而没必要在每一个网页中重复定义这些通用元素。这种方法让你能专一于开发每一个网页的独特方面,还能让修改项目的总体外观容易不少
咱们在learning_logs/templates/learning_logs下建立咱们的模板
建立一个base.html
其中咱们使用了模板标签{% %}
,模板标签是一小段代码,生成要在网页中显示的信息。这里,模板标签{% url 'learning_logs:index' %}
生成一个url,该url于learning_logs/urls.py中定义的名为index的URL模式匹配
利用模板标签来生成URL,有利于更新连接。要修改项目中的URL,只需修改urls.py中的URL模式,这样网页被请求时,Django自动插入修改后的URL
重写index.html,使其继承base.html,以下
标签{% extends %}
指定继承的父模板
标签{% block %}
定义content块,再使用{% endblock content %}
指定了内容定义的结束位置
这里,模板继承的优势开始显现出来了:在子模版中,只需包含当前网页特有的网内容。
URL模式
这个模式与这样的URL匹配:基础URL后面跟着topics,能够在末尾包含斜杠,也能够省略它,但单词topics后面不能又任何东西,不然就与该模式不匹配。该模式匹配的请求都交给views.py中的函数topics()处理
视图
导入所需数据相关联的Topic模型,将Topic对象按属性date_added排序,存入一个上下文字典中,建立使用数据的网页时,除对象request和模板的路径外,咱们还将变量context传递给render()
模板
与模板index.html相似的,topics.html继承base.html父模板
咱们使用了一个至关于for循环的模板标签,遍历字典context中的列表topics,{{ topic }}
是一个模板变量,Django会将这部分替换为topic的当前值
咱们还使用了模板标签{{% empty % }}
告诉Django在topics列表为空的时候怎么办
如今修改父模板,使其包含到显示全部主题的页面的连接
到浏览器主页单击Topics连接看到以下网页
URL模式
咱们再看看这个URL模式中的正则表达式——r'^topics/(?P<topic_id>\d+)/$'
。r让Django将这个字符串是为原始字符串,并指出正则表达式包含在引号内。表达式的第二部分(/(?P<topic_id>\d+)/)
与包含在两个斜杠内的整数匹配,并将这个整数存储在一个名为topic_id的实参中。这部分表达式两边的括号捕获URL中的值;?P<topic_id>
即将匹配的值存储在topic_id中;\d+
与包含在两个斜杠内的任何数字都匹配,无论这个数字多少位
发现URL与这个模式匹配时,Django将调用视图函数topic(),并将存储在topic_id中的值做为实参传递给它
视图
topic函数中包含了一个形参,咱们使用get()获取topic_id指定的主题,使用entry_set.order_by()获取降序排序的条目。这是一种查询,在本身的项目中编写相似的查询时,咱们应该使用Django shell先进行尝试。而后把查询结果存入字典中发送给模板topic.html
模板
该模板也继承了base.html父模板
特别的,在该模板中咱们使用了模板过滤器|
用一个竖线表示。例如date: 'M d, Y H:i'
以这样的格式显示时间戳:January 1,2015 23:00
,过滤器linebreaks
将包含换行符的长条目转换成浏览器可以理解的格式,以避免显示一个不间断的文本块
将显示全部主题的页面中的每一个主题都设置为连接
在topics请求页面中,连接到显示相应主题的页面,如http://localhost:8000/topics/1/ ,结果以下