初始教程
初始教程
创建虚拟环境
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/
- pyvenv.cfg
创建 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/ ,目录里有:
- settings.py 指定 Django 如何与你的系统交互以及如何管理项目,在开发过程中, 我们可以修改设置并添加设置
- urls.py 告诉 Django 应该创建哪些网页来响应浏览器的请求
- wsgi.py 帮助 Django 提供它创建的文件, web server gateway interface
- init.py
了解 manage.py
python manage.py migrate # 创建数据库。会生成一个 db.sqlite3 的文件,模拟一个真正的数据库
敲完这个命令,manage.py 这个工具又做了什么事情呢:
- 创建了一个名为 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) 中的数据
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 的内容
安装 application
在 Django 项目目录 learning_log/ 中,修改 settings.py,将 learning_logs 这个应用加进去
# --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() 来注册
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 模型

再定义另一个数据模型 Entry(条目)
继续在 learning_logs/models.py 加一个 Entry 类
class Entry(models.Model):
"""specific entries"""
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
from django.contrib import admin
# Register your models here.
from learning_logs.models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)
Django Shell
Django Shell 可以在交互式的终端中查看数据库中的数据
python manage.py shell
from learning_logs.models import Topic
Topic.objects.all() # 返回所有的 Topic 对象
# 获取一个对象后,就可以查看这个对象的各个属性
t = Topic.object.get(id=1)
# 重点是还可以查看关联 Topic 的 Entry
t.entry_set.all() # 返回与这个 Topic 相关联的所有 entry 对象