天天看点

Django项目的创建及初始化

参考资料:

官方手册

设置mysql

一个博主的数据库配置过程

数据库迁移介绍

  首先我们要区别项目和应用的区别

  应用是一个专门做某件事的网络应用程序——比如博客系统,或者公共记录的数据库,或者简单的投票程序。项目则是一个网站使用的配置和应用的集合。项目可以包含很多个应用。应用可以被很多个项目使用。

  也就是说,我们首先创建一个顶级项目,然后我们的子功能都是里面的应用

1 创建一个项目

django-admin startproject project_name
           

  注意命名项目时候不能用和python或django起冲突的项目名称。

  项目结构及解释如下:

# 项目容器名称,可以修改
project_name/
    # 管理项目的命令行工具
    manage.py
    project_name/
        # 空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
        __init__.py
        # django项目配置文件
        settings.py
        urls.py
        # web服务器入口
        wsgi.py
           

  通过下面的命令启动项目

py manage.py runserver
           

2 创建编辑应用

2.1 创建应用

通过下面命令行可以编辑应用,一般在项目根目录下创建顶级模块。

py manage.py startapp app_name
           

生成的目录内容结果如下:

app_name/
    # 数据移植模块,内容自动生成 
    migrations/   
    # 该应用的后台配置文件
    admin.py
    # 应用配置文件,1.9以后自动生成
    apps.py
    # 数据模块
    models.py 
    # 自动测试模块
    tests.py  
    # 逻辑代码区域
    view.py 
           

3 路由定向

  在初始化项目完成后,一般我们还需要在该应用根目录下建立urls.py文件,用于路由定向,并将这个文件添加到项目urls文件的urlpatterns 列表中。这样我们就可以在对传入路由进行截取,并传入到相应的app中进行进一步路由匹配。

  我们一般需要将app内的url名称添加命名空间。因为在项目存在多个应用时候,我们在html中如果通过path的name选择路由时,django可能会分不清楚重复路由,故加上 app_name:设置命名空间 。

# app_name/urls.py
from django.urls import path
from . import views

# 添加命名空间
app_name = 'polls'

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:question_id>/', views.detail, name='detail'),
    path('<int:question_id>/results/', views.results, name='results'),
    path('<int:question_id>/vote/', views.vote, name='vote'),]

# app_name/templates/polls/name.html
# 通过 命名空间:name形式选择路由
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
           

4 初始化数据库

4.1 配置数据库

  打开project_name/setting.py,可以在DATABASES中进行数据库设置。因为我们要链接mysql,所以在第一次使用的时候,需要安装数据库API Drever,官网推荐的是mysqlclient,安装见另一个笔记。下面是设置代码:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'text_django',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
}
}

           

  需要注意的一点是,字典里所有的关键词都必须大写。

  我们可以在文件头部的

INSTALLED_APPS

设置项。这里包括了会在你项目中启用的所有 Django 应用。应用能在多个项目中使用,你也可以打包并且发布应用,让别人使用它们。

  当开启了这些应用后,我们就需要通过下面这个命令生成一些初始表,通过可以测试mysql服务器是否链接成功。

py manage.py migrate
           
这个 migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表

4.2 创建并激活模型

(1)创建模型

  首先我们需要定义模型,也就是对应用数据库结构的设计,写在app_name/models.py文件下。通过这些信息,django可以为这个应用创建数据库 schema(生成 CREATE TABLE 语句)。创建可以与 Question 和 Choice 对象进行交互的 Python 数据库 API。

(2)激活模型

  激活之前,我们需要将应用安装到项目里,需要在项目的配置类 INSTALLED_APPS 中添加设置。app_name/apps.py 中,所以路径一般为’app_name.apps.PollsConfig’,如下:

# project_name/settng.py
INSTALLED_APPS = [
    'app_name.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',]
           

  激活涉及到django数据库迁移的两大命令

# 为model改变生成迁移文件migration
# 可在 app_name/migrations/ 文件夹下查看
python manage.py makemigrations 
# 对迁移文件执行,应用数据库迁移
python manage.py migrate
           

  第二条执行数据库操作语句只会执行还没执行过或未更新的迁移文件。 Django 通过在数据库中创建一个特殊的表 django_migrations 来跟踪执行过哪些迁移

  这两种迁移方式属于全局调用所有的,若在后面加上app_name则是对相应的app进行更改。(注意语句执行前一定要先安装应用到项目)

   通过建立以上模型,就可以直接通过模型进行数据库操作了。

5 创建管理员账户

通过如下语句创建管理员账户:

python manage.py createsuperuser

6 添加文件路径

6.1 os.path

首先需要引入os模块

(1) path.dirname

   在setting.py文件中,我们可以看到这样的设置

   这其中包含两个用法含义:

  • os.path.abspath(__file__)

    : 为获取当前文件的绝对路径
  • os.path.dirname()

    : 为获取当前路径上一级的路径

   所以这个语句表示获取当前文件(setting.py)上一级的上一级的绝对路径为根路径BASE_DIR。(也就是一般项目的根目录)

(2)path.join

  

os.path.join(path1[, path2[, ...]])

将多个路径组合在一起,第一个绝对路径之前的参数将被忽略。

6.2 sys.path

首先需要引入sys模块

   sys.path是python的搜索模块的路径集,是一个list。有两种使用方法:

  • sys.path.append(‘你的模块的名称’)

    *

    sys.path.insert(0,’模块的名称’)

   该语句经常用和path模块组合使用来为项目添加某个apps路径,这样就可以直接impot apps文件夹下的文件。

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, BASE_DIR)
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))

# apps/material
PERSONAL_APPS = [
'material.apps.MaterialConfig',
]