创建虚拟环境

  1. mkdir a_project
  2. cd a_project
  3. python -m venv django_env # 给虚拟环境取名为 django_env
  4. virtualenv django_env # 初始化这个虚拟环境,生成一些激活环境等功能的脚本
  5. 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 看)

Django_admin.png

创建应用程序

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 管理的数据时,都要走这三个步骤:

  1. 执行命令 manage.py makemigrations learning_logs
  2. 执行命令 manage.py migrate
  3. 重启 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) ```

Django Shell