Django提供的管理网站(admin site) 让你能轻松的处理模型,网站的管理员可使用管理网站,而普通用户不能
创建超级用户
python manage.py createsuperuser
XXXXX
当你执行createsuperuser时,Django会提示你属于用户名
这里输入的用户名我用XXXXX代替,但你可以输入任何用户名,电子邮件地址(也可以让这个字段为空),并且密码你需要输入两次用以确认
Username (leave blank to use 'administrator'): XXXX
Email address:
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
由于我输入的密码短于8个字符,所以Django会提示你是否确认忽略警告?如果输入Y,用户则创建,否则返回重新输入
Django并不存储你输入的密码,而存储从该密码派生出来的一个字符串--散列值
每当你输入密码时,Django都计算其散列值,并将结果与存储的散列值进行比较,如果这两个数值相同,就通过了身份验证
通过存储散列值,即便黑客获得了网站的数据访问权,也只能获取其中存储的散列值,而无法获得密码.
在网站配置正确的情况下,几乎无法根据散列值推导出原始密码
向管理网站注册模型
Django自动在管理网站中添加了一些模型,例如User和Group,但对于我们创建的模型,必须手动进行注册
我们创建应用程序learning_logs时,Django在models.py所在的目录创建了一个名为admin.py的文件
现在我们打开并修改它:
from django.contrib import admin
# Register your models here.
from learning_logs.models import Topic
admin.site.register(Topic)
这些代码导入我们要注册的模型Topic再使用admin.site.register()让Django通过管理网站管理我们的模型
现在使用超级用户访问管理网站localhost:8000/admin/ 并输入你创建的超级账户,这个网页让你能够添加和修改用户和用户组,还可以管理与刚才定义的模型Topic相关的数据
添加主题
向管理网站注册Topic后,我们来添加第一个主题,为此单机Topics进入主题网页,他几乎是空的(经我测试:他就是空的,没有几乎)这是因为我们还没有添加任何主题,单击Add你将看到一个用于添加新主题的表单
在第一个命名的方框内我们输入Chess再点击Save
此时你就返回了管理页面,其中包含刚刚创建的主题,下面再创建一个主题,以便有更多的数据可供使用,再次点击Add并创建另一个主题RockClimbing,当你单击Save时,又回到了主题管理页面,其中包含了你刚才创建的2个主题
定义模型 Entry
要写入一些东西,需要为用户可在笔记中添加的条目定义一个模型,每个条目都与特定的主题相关联,这种关系被称为 多对一关系(很混乱吧?不过我猜你很喜欢.)即多个条目可关联到同一个主题
下面是模型Entry的代码:
models.py
以前的内容 --snip--我是分割线 class Entry(models.Model): #学到的有关某个主题的具体知识 topic = models.Foreignkey(topic,on_delete=models.CASCADE)
text = models.TextField() date_added = models.DateTimeField(auto_now_add=True) class Meta: verbose_name_plural = 'entries' def __str__(self): #返回模型的字符串 return self.text[:50]+"..."
和Topic一样,Entry也继承了Django基类Model,第一个属性topic是一个Foreignkey实例,外键是一个数据库术语,他引用了数据库中的另一条记录
这些代码将每个条目关联到特定的主题,每个主题创建时都给他分配了一个键(ID),需要在两项数据之间建立联系时,Django使用与没想信息相关联的键
接下来是属性text 他是一个TextField实例,这种字段不需要长度限制,因为我们不想限制字符长度
属性date_added让我们能够按创建顺序呈现条目,并在每个条目旁放置时间戳.
我们还嵌套了一个Meta类,存储用于管理模型的额外信息,在这里他让我们能够设置一个特殊属性,让Django在需要时使用Entries来表示多个条目
如果没有这个类,Django将使用Entrys来表示多个条目,最后方法__str__()告诉Django呈现条目时应显示哪些信息.由于条目包含的文本可能很长,我们
让Django只显示text的前50个字符,我们还添加了省略号,代表显示的并非整个条目.
修改模型Entry
由于我们添加了一个新的模型,因此需要再次修改数据库,你将慢慢滴对这个过程了如指掌,修改models.py后,执行如下命令:
(ll_env) C:\Users\Administrator\learning_log>python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
learning_logs\migrations\0002_entry.py
- Create model Entry
(ll_env) C:\Users\Administrator\learning_log>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
Applying learning_logs.0002_entry... OK
看,他生成了一个新的迁移文件 0002_entry.py
他告诉Django如何修改数据库,使其能够存储于模型Entry相关的信息,执行命令migrate我们发现Django应用了这种迁移且一切顺利.
向管理网站注册 Entry
我们还需要注册模型Entry 因此 需要将admin.py修改成类似于下面这样
from...以前的不管
from learning_logs.models import Topic,Entry
admin...以前的不管
admin.site.register(Entry)
现在返回后台的管理界面 你讲看到learning_logs下列出了Entries(如果没有,注意浏览器缓存)
单机Entries的Add链接你将看到一个下拉列表,让你能够选择要为哪个主题创建条目,还有一个用于输入条目的文本框,从下拉列表中选择chess创建一些条目文章