创建虚拟环境
mkdir a_project
cd a_project
python -m venv django_env # 给虚拟环境取名为 django_env
virtualenv django_env # 初始化这个虚拟环境,生成一些激活环境等功能的脚本
source django_env/bin/activate
在 a_project/django_env/ 虚拟环境的目录中有哪些东西呢:
- Include/
- Lib/
- site-packages/ 在虚拟环境中用 pip 安装的包都存放于此
- Scripts/
-
创建 Django 项目
django-admin.py startproject learning_log . # 项目名: learning_log, 会生成一个 learning_log 的目录
现在在 a_project 这个目录中,而且通过上述命令
source django_env/bin/activate
加载了 django_env 虚拟环境。然后又通过django-admin.py startproject learning_log .
脚本开起了一个 Django 项目。那现在到底又创建了什么东西呢? manage.py 一个可以用来管理 Django 项目的工具,如:管理数据库,运行服务器等
一个名为 learning_log 的 Django 项目,在操作系统中表现为 a_project 目录下的一个子目录,即: a_projcet/learning_log/ ,目录里有:
创建了一个名为 db.sqlite3 的数据库文件,即 a_project/db.sqlite3,这里注意,db.sqlite3 这个数据库文件是创建在 learning_log/ 目录外的,意思是它不属于 learning_log 这个 Django 项目
接下来,manage.py 将作为核心管理 Django 的工具来被使用
运行项目
web框架已经建好,虽然现在什么应用程序都没有,但是仍然可以开始运行这个项目。
同样现在处于 a_project 这个目录中,而且加载的是 django_env 虚拟环境
python manage.py runserver # 默认使用 8000 端口,会起一个 web server
# python manage.py runserver 8001 指定端口启动
Django 管理网站
还是先明确下现在的各种概念,learning_logs 只是 learning_log 这个 Django 项目中的一个应用程序。现在再讲一个 manage.py 的命令 createsuperuser
,从名称上就可以知道,这是给这个 Web 项目,建一个超级用户或者说管理员用户。
python manage.py createsuperuser
建完用户之后赶紧体验一下能否登陆
访问 http://localhost:8000/admin (这个 URL 是 Django 默认配置好的,不信你点开 learning_log/urls.py 看)
创建应用程序
python manage.py startapp learning_logs # 应用名:learning_logs, 会生成一个 learning_logs 的目录
看看 learning_logs/ 目录下有些什么东西:其实这些东西就是 Django 建立创建应用程序所需的基础设施。
- admin.py 管理模型(Model)
- migrations.py
- models.py 可以定义我们在应用程序中管理的数据,(要在这个文件里写代码了)
- test.py
- views.py
- init.py
定义首个模型 Topic
在 learning_logs/models.py 中定义一个 Topic 模型。告诉 Django 如何处理应用程序 (learning_logs) 中的数据 ```python from django.db import models
Create your models here.
class Topic(models.Model): text = models.CharField(max_length=200) date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.text
- text 是一个 Django 数据模型中的 CharFiled 实例,用来存放有限字符长度的数据,在后续 web 上新增一个 Topic 时,指定 Topic 名称
- date_added 是一个时间字段实例,在被创建 Topic 实例,自动添加创建的时间
- 改写 `__str__` 方法,创建好的 Topic 需要显示在 admin 页面上,就是返回 text 的内容
<a name="uVSkY"></a>
## 安装 application
在 Django 项目目录 learning_log/ 中,修改 settings.py,将 learning_logs 这个应用加进去
```python
# --ship--
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# My apps
'learning_logs',
]
# --ship--
迁移模型 Topic 至数据库
接下来,让 Django 修改数据库,使其能够存储与模型 Topic 相关的信息
先用 manage.py 的 makemigrations 命令,让 Django 确认该如何修改数据,再通过 migrate 确认执行这种迁移
python manage.py makemigrations learning_logs
python manage.py migrate
python manage.py runserver
以后每当要修改 learning_logs 管理的数据时,都要走这三个步骤:
- 执行命令
manage.py makemigrations learning_logs
- 执行命令
manage.py migrate
- 重启 web server
manage.py runserver
向管理网站注册模型 Topic
登陆 admin 后台之后,可以看到有两个默认存在的两个模型,User 和 Group。在之前创建的模型,必须在 learning_logs/admin.py 中调用 admin.site.register() 来注册 ```python from django.contrib import admin
Register your models here.
from learning_logs.models import Topic
admin.site.register(Topic)
再刷新 http://localhost:8000/admin ,发现多了 learning_logs 这个应用,并且下面跟着 Topic 模型<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/10370900/1617367709900-66308514-3c35-48e1-b5f2-f0c1e3bc51d5.png#align=left&display=inline&height=366&margin=%5Bobject%20Object%5D&name=image.png&originHeight=366&originWidth=936&size=28012&status=done&style=none&width=936)
<a name="IAHyg"></a>
## 再定义另一个模型 Entry
继续在 learning_logs/models.py 加一个 Entry 类
```python
class Entry(models.Model):
"""specific knowledge"""
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 字段是一个外键实例,关联 Topic 模型,这样在新增一个 Entry 时,就可以在界面上从一个 Topic 列表中选择一个 Topic
- text 字段是一个 Django TextField 实例,就是用来存不限字数的文本
- date_added 如上面的 Topic 类一样,在被创建 Entry 实例时,自动添加创建的时间
- 添加一个 Meta 类,并指定 verbose_name_plural ,是为了告诉 Django,在 admin 页面上显示 Entries (Django 默认在单词后加 s ,就会显示 Entrys)
- 改写
__str__
方法,在创建完成一个 Entry 实例后,在管理页面上只会显示前50个字符,加上 … 三个字符,统一所有 Entry 实例的显示长度再迁移模型 Entry 至数据库
python manage.py makemigrations learning_logs python manage.py migrate python manage.py runserver
再向管理网站注册模型 Entry
修改 learning_logs/admin.py ```python from django.contrib import admin
Register your models here.
from learning_logs.models import Topic
admin.site.register(Topic) admin.site.register(Entry) ```