运行下面命令就可以创建一个 django 项目,项目名称叫 mysite :
创建后的项目目录如下:
说明:
<code>__init__.py</code> :让 python 把该目录当成一个开发包 (即一组模块)所需的文件。 这是一个空文件,一般你不需要修改它。
<code>manage.py</code> :一种命令行工具,允许你以多种方式与该 django 项目进行交互。 键入<code>python manage.py help</code>,看一下它能做什么。 你应当不需要编辑这个文件;在这个目录下生成它纯是为了方便。
<code>settings.py</code> :该 django 项目的设置或配置。
<code>urls.py</code>:django项目的url路由设置。目前,它是空的。
接下来,你可以修改 settings.py 文件,例如:修改 <code>language_code</code>、设置时区 <code>time_zone</code>
在运行项目之前,我们需要创建数据库和表结构,这里我使用的默认数据库:
然后启动服务:
你会看到下面的输出:
你也可以指定启动端口:
以及指定 ip:
前面创建了一个项目并且成功运行,现在来创建一个 app,一个 app 相当于项目的一个子模块。
在项目目录下创建一个 app:
如果操作成功,你会在 mysite 文件夹下看到已经多了一个叫 polls 的文件夹,目录结构如下:
每一个 django model 都继承自 django.db.models.model
在 model 当中每一个属性 attribute 都代表一个 database field
通过 django model api 可以执行数据库的增删改查, 而不需要写一些数据库的查询语句
打开 polls 文件夹下的 models.py 文件。创建两个模型:
然后在 mysite/settings.py 中修改 ` installed_apps` 添加 polls:
在添加了新的 app 之后,我们需要运行下面命令告诉 django 你的模型做了改变,需要迁移数据库:
你会看到下面的输出日志:
你可以从 polls/migrations/0001_initial.py 查看迁移语句。
运行下面语句,你可以查看迁移的 sql 语句:
输出结果:
你可以运行下面命令,来检查数据库是否有问题:
再次运行下面的命令,来创建新添加的模型:
总结一下,当修改一个模型时,需要做以下几个步骤:
修改 models.py 文件
运行 <code>python manage.py makemigrations</code> 创建迁移语句
运行 <code>python manage.py migrate</code>,将模型的改变迁移到数据库中
创建了模型之后,我们可以通过 django 提供的 api 来做测试。运行下面命令可以进入到 python shell 的交互模式:
下面是一些测试:
打印所有的 question 时,输出的结果是 <code>[<question: question object>]</code>,我们可以修改模型类,使其输出更为易懂的描述。修改模型类:
接下来继续测试:
django有一个优秀的特性, 内置了django admin后台管理界面, 方便管理者进行添加和删除网站的内容.
新建的项目系统已经为我们设置好了后台管理功能,见 mysite/settings.py:
同时也已经添加了进入后台管理的 url, 可以在 mysite/urls.py 中查看:
接下来我们需要创建一个管理用户来登录 admin 后台管理界面:
上面创建了一个 admin 的超级用户,密码也为 admin。
再次运行项目:
输入用户名和密码,你可以看到:
这时候你可以看到,你可以修改 groups 和 users 两个对象,但是你不能修改你添加的模型。下面来使你添加的模型也能修改,修改 polls/admin.py:
你单击表头时,会发现 was_published_recently 这一列无法排序,我们可以修改 polls/models.py 中的 question 模型,额外添加一些属性:
在项目根路径创建一个 templates 目录,并修改 mysite/settings.py 文件,添加下面设置:
在 templates 下面创建一个 admin 目录,并从 django admin 模板路径下拷贝 admin/base_site.html 文件到 admin 目录下,修改该文件:
同样,你可以参考上面定制 admin/index.html 内容。
安装:
然后在 mysite/settings.py 中修改 installed_apps:
django 中 views 里面的代码就是一个一个函数逻辑,处理客户端(浏览器)发送的 httprequest,然后返回 httpresponse。
创建 <code>polls/views.py </code>文件并添加如下内容:
在 <code>polls/urls.py</code> 中添加一个 url 映射:
这时候 polls 目录结构如下:
在上面视图文件中,我们只是告诉 django,所有指向 url <code>/index/</code> 的请求都应由 index 这个视图函数来处理。
django 在检查 url 模式前,移除每一个申请的url开头的斜杠。 这意味着我们为 <code>/index/</code> 写url模式不用包含斜杠。
模式包含了一个尖号(<code>^</code>)和一个美元符号(<code>$</code>)。这些都是正则表达式符号,并且有特定的含义: ^要求表达式对字符串的头部进行匹配,$符号则要求表达式对字符串的尾部进行匹配。
如果你访问 <code>/index</code>,默认会重定向到末尾带有反斜杠的请求上去,这是受配置文件setting中 <code>append_slash</code> 项控制的。
如果你是喜欢所有url都以 <code>/</code> 结尾的人(django开发者的偏爱),那么你只需要在每个 url 后添加斜杠,并且设置 <code>append_slash</code> 为 “true”。如果不喜欢url以斜杠结尾或者根据每个 url 来决定,那么需要设置 <code>append_slash</code> 为 “false”,并且根据你自己的意愿来添加结尾斜杠/在url模式后。
接下来配置项目根路径的 url 映射,修改 mysite/urls.py 如下:
修改 polls/views.py 文件,添加:
然后,修改 polls/urls.py 添加映射:
正则表达式是通用的文本模式匹配的方法。 django urlconfs 允许你使用任意的正则表达式来做强有力的 url 映射,不过通常你实际上可能只需要使用很少的一部分功能。这里是一些基本的语法。
符号
匹配
.
任意单一字符
\d
任意一位数字
[a-z]
a 到 z中任意一个字符(大写)
a 到 z中任意一个字符(小写)
[a-za-z]
a 到 z中任意一个字符(不区分大小写)
+
匹配一个或更多 (例如, \d+ 匹配一个或 多个数字字符)
[^/]+
一个或多个不为‘/’的字符
*
零个或一个之前的表达式(例如:\d? 匹配零个或一个数字)
匹配0个或更多 (例如, \d* 匹配0个 或更多数字字符)
{1,3}
介于一个和三个(包含)之前的表达式(例如,\d{1,3}匹配一个或两个或三个数字)
接下来使视图返回动态内容,修改 mysite/views.py 内容如下:
接下来在视图中使用模板,在 settings.py 中有一个 <code>template_loaders</code> 属性,并且有一个默认值 <code>django.template.loaders.app_directories.loader</code>,该值定义了从每一个安装的 app 的 templates 目录下寻找模板,故我们可以在 polls 目录下创建 templates 目录以及其子目录 polls。
现在创建一个首页页面 polls/templates/polls/index.html:
注意: 页面中的 latest_question_list 变量来自视图返回的上下文,见下面 context 变量
然后更新 polls/views.py 视图,来使用模板:
代码说明:
通过 loader 来加载模板页面,如前面提到的,这里是相对 polls/templates 目录
创建上下文,将需要传递到页面的变量放入上下文变量 context
使用 template 通过上下文来渲染页面
上面代码,可以使用 <code>render()</code> 来简化:
当查询数据返回错误时,可以抛出异常,让页面重定向到 404 页面:
现在,我们可以回过头来修改 polls/index.html 页面中下面代码:
上面代码中的 url 为硬编码的,我们可以将其修改为:
为了避免多个视图的名称,例如 detail 视图,的冲突,我们可以给 url 添加命名空间,修改 mysite/urls.py:
然后,修改 polls/templates/polls/index.html 为:
接下来创建明细页面 polls/templates/polls/detail.html:
创建一个显示投票结果页面 polls/templates/polls/results.html :
接下来修改 polls/views.py 添加 detail 、 vote 和 results 三个函数:
重启服务进行测试,检查是否有错误。
如果我们要针对很多模型编写视图,则有很多代码都是重复的,我们可以使用 django 中的通用视图来简化代码。首先,我们将 polls/urls.py 改成如下:
然后,我们删除 polls/views.py 中的 index、detail 和 results 三个函数,vote 函数和之前保持一致,最后改为如下:
这里我们使用了两个通用视图 : listview 和 detailview,来和模型相关联。
detailview 视图需要传递一个名称为 pk 表示模型主键的参数,所以我们需要把 url 映射中的 question_id 改为 pk。
默认情况下, detailview使用 <code><app name>/<model name>_detail.html</code> 模板,我们可以使用 <code>template_name</code> 变量重新定义模板路径;类似的, listview 默认使用<code><app name>/<model name>_list.html</code> 模板。
detailview 视图中的上下文默认就包含了对模型的引用,如 question 变量;对于 listview 视图,为 question_list 变量,如果我们想修改该变量名称,可以通过<code>context_object_name 变量覆盖默认的名称</code>,如使用 latest_question_list 代替 question_list。
最后,来看项目目录结构:
通过上面的介绍,对 django 的安装、运行以及如何创建视图和模型有了一个清晰的认识,接下来就可以深入的学习 django 的自动化测试、持久化、中间件、国际化等知识。