天天看点

如何创建一个Django网站1. 创建项目2. 运行项目3. 创建 app4. 创建模型5. 管理 admin6. 视图和URL配置7. 总结

运行下面命令就可以创建一个 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>[&lt;question: question object&gt;]</code>,我们可以修改模型类,使其输出更为易懂的描述。修改模型类:

接下来继续测试:

django有一个优秀的特性, 内置了django admin后台管理界面, 方便管理者进行添加和删除网站的内容.

新建的项目系统已经为我们设置好了后台管理功能,见 mysite/settings.py:

同时也已经添加了进入后台管理的 url, 可以在 mysite/urls.py 中查看:

接下来我们需要创建一个管理用户来登录 admin 后台管理界面:

上面创建了一个 admin 的超级用户,密码也为 admin。

再次运行项目:

如何创建一个Django网站1. 创建项目2. 运行项目3. 创建 app4. 创建模型5. 管理 admin6. 视图和URL配置7. 总结

输入用户名和密码,你可以看到:

如何创建一个Django网站1. 创建项目2. 运行项目3. 创建 app4. 创建模型5. 管理 admin6. 视图和URL配置7. 总结

这时候你可以看到,你可以修改 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>&lt;app name&gt;/&lt;model name&gt;_detail.html</code> 模板,我们可以使用 <code>template_name</code> 变量重新定义模板路径;类似的, listview 默认使用<code>&lt;app name&gt;/&lt;model name&gt;_list.html</code> 模板。

detailview 视图中的上下文默认就包含了对模型的引用,如 question 变量;对于 listview 视图,为 question_list 变量,如果我们想修改该变量名称,可以通过<code>context_object_name 变量覆盖默认的名称</code>,如使用 latest_question_list 代替 question_list。

最后,来看项目目录结构:

通过上面的介绍,对 django 的安装、运行以及如何创建视图和模型有了一个清晰的认识,接下来就可以深入的学习 django 的自动化测试、持久化、中间件、国际化等知识。