?
目录
我们需要告诉Django,默认应使用哪个属性来显示有关主题的信息。Django调用方法 __str__()来显示模型的简单表示。在这里,我们编写了方法__str__(),它返回存储在属性text 中的字符串(见3)。
如果你使用的是Python 2.7,应调用方法__unicode__(),而不是__str__(),但其中的代 码相同。
要使用模型,必须让Django将应用程序包含到项目中。为此,打开settings.py(它位于目录 learning_log/learning_log中),你将看到一个这样的片段,即告诉Django哪些应用程序安装在项 目中:
settings.py
--snip--
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
--snip--
这是一个元组,告诉Django项目是由哪些应用程序组成的。请将INSTALLED_APPS修改成下面 这样,将前面的应用程序添加到这个元组中:
--snip--
INSTALLED_APPS = (
--snip--
'django.contrib.staticfiles',
# 我的应用程序
'learning_logs',
)
--snip--
通过将应用程序编组,在项目不断增大,包含更多的应用程序时,有助于对应用程序进行跟 踪。这里新建了一个名为My apps的片段,当前它只包含应用程序learning_logs。 接下来,需要让Django修改数据库,使其能够存储与模型Topic相关的信息。为此,在终端 窗口中执行下面的命令:
(ll_env)learning_log$ python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
0001_initial.py:
- Create model Topic
(ll_env)learning_log$
命令makemigrations让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相 关联的数据。输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中 为模型Topic创建一个表。 下面来应用这种迁移,让Django替我们修改数据库:
(ll_env)learning_log$ python manage.py migrate
--snip--
Running migrations:
Rendering model states... DONE
1 Applying learning_logs.0001_initial... OK
这个命令的大部分输出都与我们首次执行命令migrate的输出相同。我们需要检查的是1处的 输出行,在这里,Django确认为learning_logs应用迁移时一切正常(OK)。 每当需要修改“学习笔记”管理的数据时,都采取如下三个步骤:修改models.py;对 learning_logs调用makemigrations;让Django迁移项目。
为应用程序定义模型时,Django提供的管理网站(admin site)让你能够轻松地处理模型。网 站的管理员可使用管理网站,但普通用户不能使用。在本节中,我们将建立管理网站,并通过它 使用模型Topic来添加一些主题。
Django允许你创建具备所有权限的用户——超级用户。权限决定了用户可执行的操作。最严 格的权限设置只允许用户阅读网站的公开信息;注册了的用户通常可阅读自己的私有数据,还可 查看一些只有会员才能查看的信息。为有效地管理Web应用程序,网站所有者通常需要访问网站 存储的所有信息。优秀的管理员会小心对待用户的敏感信息,因为用户对其访问的应用程序有极 大的信任。 为在Django中创建超级用户,请执行下面的命令并按提示做:
(ll_env)learning_log$ python manage.py createsuperuser
1 Username (leave blank to use 'ehmatthes'): ll_admin
2 Email address:
3 Password:
Password (again):
Superuser created successfully.
(ll_env)learning_log$
你执行命令createsuperuser时,Django提示你输入超级用户的用户名(见1)。这里我们输 入的是ll_admin,但你可以输入任何用户名,比如电子邮件地址,也可让这个字段为空(见2)。 你需要输入密码两次(见3)。
可能会对网站管理员隐藏有些敏感信息。例如,Django并不存储你输入的密码,而存储 从该密码派生出来的一个字符串——散列值。每当你输入密码时,Django都计算其散列 值,并将结果与存储的散列值进行比较。如果这两个散列值相同,就通过了身份验证。 通过存储散列值,即便黑客获得了网站数据库的访问权,也只能获取其中存储的散列值, 而无法获得密码。在网站配置正确的情况下,几乎无法根据散列值推导出原始密码。
Django自动在管理网站中添加了一些模型,如User和Group,但对于我们创建的模型,必须 手工进行注册。 我们创建应用程序learning_logs时,Django在models.py所在的目录中创建了一个名为 admin.py的文件:
admin.py
from django.contrib import admin
# 在这里注册你的模型
为向管理网站注册Topic,请输入下面的代码:
from django.contrib import admin
1 from learning_logs.models import Topic
2 admin.site.register(Topic)
这些代码导入我们要注册的模型Topic(见1),再使用admin.site.register()(见2)让 Django通过管理网站管理我们的模型。
现在,使用超级用户账户访问管理网站:访问http://localhost:8000/admin/,并输入你刚创建 的超级用户的用户名和密码,你将看到类似于图18-2所示的屏幕。这个网页让你能够添加和修改 用户和用户组,还可以管理与刚才定义的模型Topic相关的数据。
如果你在浏览器中看到一条消息,指出访问的网页不可用,请确认你在终端窗口中运行 着Django服务器。如果没有,请激活虚拟环境,并执行命令python manage.py runserver。
向管理网站注册Topic后,我们来添加第一个主题。为此,单击Topics进入主题网页,它几乎 是空的,这是因为我们还没有添加任何主题。单击Add,你将看到一个用于添加新主题的表单。 在第一个方框中输入Chess,再单击Save,这将返回到主题管理页面,其中包含刚创建的主题。
下面再创建一个主题,以便有更多的数据可供使用。再次单击Add,并创建另一个主题Rock Climbing。当你单击Save时,将重新回到主题管理页面,其中包含主题Chess和Rock
Climbing。
要记录学到的国际象棋和攀岩知识,需要为用户可在学习笔记中添加的条目定义模型。每个 条目都与特定主题相关联,这种关系被称为多对一关系,即多个条目可关联到同一个主题。 下面是模型Entry的代码:
models.py
from django.db import models
class Topic(models.Model):
--snip--
1 class Entry(models.Model):
"""学到的有关某个主题的具体知识"""
2 topic = models.ForeignKey(Topic)
3 text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
4 class Meta:
verbose_name_plural = 'entries'
def __str__(self):
"""返回模型的字符串表示"""
5 return self.text[:50] + "..."
像Topic一样,Entry也继承了Django基类Model(见1)。第一个属性topic是一个ForeignKey实 例(见2)。外键是一个数据库术语,它引用了数据库中的另一条记录;这些代码将每个条目关联 到特定的主题。每个主题创建时,都给它分配了一个键(或ID)。需要在两项数据之间建立联系时, Django使用与每项信息相关联的键。稍后我们将根据这些联系获取与特定主题相关联的所有条目。
接下来是属性text,它是一个TextField实例(见3)。这种字段不需要长度限制,因为我们 不想限制条目的长度。属性date_added让我们能够按创建顺序呈现条目,并在每个条目旁边放置 时间戳。
在4处,我们在Entry类中嵌套了Meta类。Meta存储用于管理模型的额外信息,在这里,它让 我们能够设置一个特殊属性,让Django在需要时使用Entries来表示多个条目。如果没有这个类, Django将使用Entrys来表示多个条目。最后,方法__str__()告诉Django,呈现条目时应显示哪些 信息。由于条目包含的文本可能很长,我们让Django只显示text的前50个字符(见5)。我们还 添加了一个省略号,指出显示的并非整个条目。
由于我们添加了一个新模型,因此需要再次迁移数据库。你将慢慢地对这个过程了如指掌: 修 改models.py,执行命令python manage.py makemigrations app_name,再执行命令python manage.py migrate。 下面来迁移数据库并查看输出:
(ll_env)learning_log$ python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
1 0002_entry.py:
- Create model Entry
(ll_env)learning_log$ python manage.py migrate
Operations to perform:
--snip--
2 Applying learning_logs.0002_entry... OK
生成了一个新的迁移文件——0002_entry.py,它告诉Django如何修改数据库,使其能够存储 与模型Entry相关的信息(见1)。执行命令migrate,我们发现Django应用了这种迁移且一切顺利 (见2)。
我们还需要注册模型Entry。为此,需要将admin.py修改成类似于下面这样:
admin.py
from django.contrib import admin
from learning_logs.models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)
返回到http://localhost/admin/,你将看到learning_logs下列出了Entries。单击Entries的Add链接, 或者单击Entries再选择Add entry。你将看到一个下拉列表,让你能够选择要为哪个主题创建条目, 还有一个用于输入条目的文本框。从下拉列表中选择Chess,并添加一个条目。下面是我添加的 第一个条目。
The opening is the first part of the game, roughly the first ten moves or so. In the opening, it’s a good idea to do three things— bring out your bishops and knights, try to control the center of the board, and castle your king.(国际象棋的第一个阶段是开局,大致是前10步左右。在开局阶 段,最好做三件事情:将象和马调出来;努力控制棋盘的中间区域;用车将王护住。)
Of course, these are just guidelines. It will be important to learn when to follow these guidelines and when to disregard these suggestions.(当然,这些只是指导原则。学习什么 情况下遵守这些原则、什么情况下不用遵守很重要。) 当你单击Save时,将返回到主条目管理页面。在这里,你将发现使用text[:50]作为条目的 字符串表示的好处:管理界面中,只显示了条目的开头部分而不是其所有文本,这使得管理多个 条目容易得多。 再来创建一个国际象棋条目,并创建一个攀岩条目,以提供一些初始数据。下面是第二个国 际象棋条目。
In the opening phase of the game, it’s important to bring out your bishops and knights. These pieces are powerful and maneuverable enough to play a significant role in the beginning moves of a game.(在国际象棋的开局阶段,将象和马调出来很重要。这些棋子威力大, 机动性强,在开局阶段扮演着重要角色。) 下面是第一个攀岩条目: One of the most important concepts in climbing is to keep your weight on your feet as much as possible. There’s a myth that climbers can hang all day on their arms. In reality, good climbers have practiced specific ways of keeping their weight over their feet whenever possible. (最重要的攀岩概念之一是尽可能让双脚承受体重。有谬误认为攀岩者能依靠手臂的力 量坚持一整天。实际上,优秀的攀岩者都经过专门训练,能够尽可能让双脚承受体重。) 继续往下开发“学习笔记”时,这三个条目可为我们提供使用的数据。