Django - 基本入门

Django 简介

  • 是一个开放源代码的 Web 应用框架,由 Python 写成
  • 初次发布于 2005 年 7 月,并于 2008 年 9 月发布了第一个正式版本 1.0
  • MVC

    • 概述

      • 一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC 被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
    • 核心思想

      • 解耦
    • 图解

      MVC

    • 编程模式

      • Model(模型)
        • 是应用程序中用于处理应用程序数据逻辑的部分
        • 通常模型对象负责在数据库中存取数据
      • View(视图)
        • 是应用程序中处理数据显示的部分
        • 通常视图是依据模型数据创建的
      • Controller(控制器)
        • 是应用程序中处理用户交互的部分
        • 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据
    • 优点

      • 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
  • MTV

    • 概述

      • 本质上与 MVC 模式没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同
    • 核心思想

      • 解耦
    • 图解

      MTV

    • 编程模式

      • Model(模型)
        • 负责业务对象与数据库的对象 (ORM)
      • Template(模板)
        • 负责如何把页面展示给用户
      • View(视图)
        • 负责业务逻辑,并在适当的时候调用 Model 和 Template
    • 注意

      • Django 还有一个 url 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 view 处理,view 再调用相应的 Model 和 Template

Django 安装

  • Django 与 Python 版本对应关系

    Django version Python versions
    1.8 2.7,3.2(until the end of 2016),3.3,3.4,3.5
    1.9,1.10 2.7,3.4,3.5
    1.11 2.7,3.4,3.5,3.6
    2.0 3.4,3.5,3.6
    2.1 3.5,3.6,3.7
  • 安装过程

    1. 进入黑屏终端
    2. 输入 pip install Django==1.11.4
    3. 验证是否安装成功
      • 进入 python 环境
        1
        2
        3
        >>> import django
        >>> django.get_version()
        '1.11.4'

Django 项目创建

  • 打开黑屏终端,进入工程存放目录

    1
    django-admin startproject project
  • 目录层级

    • manage.py 文件
      • 一个命令行工具,可以使我们使用多种方式对 Django 项目进行交互
    • project 目录
      • __init__.py:一个空文件,它告诉 Python 这个目录应该被看做一个 Python 包
      • settings.py:项目的配置文件
      • urls.py:项目的 URL 声明
      • wsgi.py:项目与 WSGI 兼容的 Web 服务入口

基本操作

  • 设置表结构

    表结构

  • 数据库配置

    • 注意:Django 默认使用的是 SQLite 数据库
    • 通过 settings.py 文件中的 DATABASES 选项进行配置
    • __init__.py 文件中添加以下代码
      1
      2
      3
      import pymysql

      pymysql.install_as_MySQLdb()
    • DATABASES 做如下修改
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      DATABASES = {
      'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': '数据库名',
      'USER': '用户名',
      'PASSWORD': '密码',
      'HOST': 'IP',
      'PORT': '端口'
      }
      }
  • 创建应用

    • 在一个工程中可以创建一个或者多个应用,每个应用对应处理一类业务逻辑
    • 黑屏终端进入工程目录下
      1
      python manage.py startapp myApp
  • 激活应用

    • 配置 settings.py 中的 INSTALL_APPS

      1
      2
      3
      4
      5
      6
      7
      8
      9
      INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      'myApp',
      ]
  • 定义模型

    • 概述

      • 有一个数据表,就对应有一个模型类
    • 在应用目录下的 models.py 文件中定义模型

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      from django.db import models


      # Create your models here.

      # 定义模型
      class Grade(models.Model):
      name = models.CharField(max_length=20)
      boyNum = models.IntegerField()
      girlNum = models.IntegerField()
      isDelete = models.BooleanField(default=False)


      class Student(models.Model):
      name = models.CharField(max_length=20)
      sex = models.BooleanField()
      content = models.CharField(max_length=20)
      age = models.IntegerField()
      grade = models.ForeignKey("Grade")
      isDelete = models.BooleanField(default=False)
    • 说明

      • 不需要定义主键,在生成时自动添加,并且值为自动增长
  • 生成数据表

    • 生成迁移文件

      1
      python manage.py makemigrations

      在应用目录下的 migrations 目录下生成一个迁移文件

    • 执行迁移

      1
      python manage.py migrate

      在数据库中生成对应的表

  • 数据测试

    • 进入 python shell 模式

      1
      python manage.py shell
    • 引入包

      1
      from myApp.models import Student,Grade
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      >>> from myApp.models import Student,Grade
      >>> grade = Grade()
      >>> grade.name = "zzpython1801"
      >>> grade.boyNum = 40
      >>> grade.girlNum = 10
      >>> grade.save()
      >>> sut = Student()
      >>> sut.name = "sunck"
      >>> sut.sex = True
      >>> sut.contend = "sunck is a good man"
      >>> sut.age = 18
      >>> sut.grade = grade
      >>> sut.save()
    • 1
      stu2.delete()

      仅仅删除数据库中对应数据,程序中的对象依然可以使用

      • 恢复数据
        1
        stu2.save()
    • 1
      2
      3
      >>> stu = Student.objects.get(pk=1)
      >>> stu.age = 19
      >>> stu.save()
      • 获取所有数据

        1
        stus = Student.objects.all()
      • 获取一个数据

        1
        Grade.objects.get(pk=1)
  • 启动服务

    • 格式

      1
      python manage.py runserver ip:port

      1.ip 可以不写 python manage.py runserver port
      2. 端口号默认为 8000,可以修改 python manage.py runserver 8080

    • 说明

      • 这是一个纯 python 编写的轻量级 web 服务器,仅在开发阶段中使用,稳定性低。
      • 如果修改了文件不需要手动启动服务,会自动重启。如果删除文件需要手动重启服务。
  • 视图的基本使用

    • 概述

      • 视图是对 WEB 请求进行的响应。
      • 视图接收 request 对象作为第一个参数,包含了请求的信息,是由 Django 服务构建而成的。
      • 视图的本质就是一个函数,被定义在 views.py 文件中。
    • 定义视图

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      from django.shortcuts import render
      from django.http import HttpResponse
      from myApp.models import Student, Grade


      # Create your views here.
      def index(request):
      return HttpResponse('<H1>Hello Django</H1>')


      def students(request):
      stus = Student.objects.all()
      print(stus)
      return HttpResponse("所有学生信息")


      def grades(request):
      gs = Grade.objects.all()
      print(gs)
      return HttpResponse("所有班级信息")
    • 路由配置

      • 主路由:
        • 关联子路由

          1
          2
          3
          4
          5
          6
          7
          from django.conf.urls import url, include
          from django.contrib import admin

          urlpatterns = [
          url(r'^admin/', admin.site.urls),
          url(r'^', include('myApp.urls')),

      • 子路由
        • 在应用目录下创建名为 urls.py 的文件作为子路由文件

          1
          2
          3
          4
          5
          6
          7
          8
          9
          # -*- coding:utf-8 -*-
          from django.conf.urls import url
          from myApp import views

          urlpatterns = [
          url(r'^$', views.index),
          url(r'^students/$', views.students),
          url(r'^grades/$', views.grades),
          ]
  • 模板的基本使用

    • 概述

      • 模板是 HTML 页面,可以根据视图中传递的数据进行填充 (渲染)
    • 创建模板存放目录

      • 工程目录下创建名为 templates 的目录
      • 在 templates 目录下创建对应应用目录
    • 配置模板路径

      1
      2
      3
      4
      TEMPLATES = [
      {
      'BACKEND': 'django.template.backends.django.DjangoTemplates',
      'DIRS': [os.path.join(BASE_DIR, "templates")],
    • 定义模板

      • index.html
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        <!DOCTYPE html>
        <html lang="en">
        <head>
        <meta charset="UTF-8">
        <title>主页</title>
        </head>
        <body>
        <h1>Hello World</h1>
        </body>
        </html>
      • students.html
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        <!DOCTYPE html>
        <html lang="en">
        <head>
        <meta charset="UTF-8">
        <title>学生信息</title>
        </head>
        <body>
        <h1>学生信息</h1>
        <ul>
        {% for stu in stus %}
        <li>{{ stu.name }}--{{ stu.age }}--{{ stu.grade }}</li>
        {% endfor %}
        </ul>
        </body>
        </html>
      • grades.html
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        <!DOCTYPE html>
        <html lang="en">
        <head>
        <meta charset="UTF-8">
        <title>班级信息</title>
        </head>
        <body>
        <h1>班级信息</h1>
        <ul>
        {% for grade in grades %}
        <li>{{ grade.name }}</li>
        {% endfor %}
        </ul>
        </body>
        </html>
    • views.py 中使用模板文件

      • 基本使用

        1
        2
        3
        def index(request):
        # return HttpResponse('<H1>Hello Django</H1>')
        return render(request, 'myApp/index.html')
      • 给模板传递数据并渲染后返回页面

        1
        2
        3
        4
        5
        def students(request):
        stus = Student.objects.all()
        print(stus)
        # return HttpResponse("所有学生信息")
        return render(request, 'myApp/students.html', {"stus": stus})
        1
        2
        3
        4
        5
        def grades(request):
        gs = Grade.objects.all()
        print(gs)
        # return HttpResponse("所有班级信息")
        return render(request, 'myApp/grades.html', {"grades": gs})
    • 扩展

      • 点击班级展示对应班级的学生
        • 模板 grades.html
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          <!DOCTYPE html>
          <html lang="en">
          <head>
          <meta charset="UTF-8">
          <title>班级信息</title>
          </head>
          <body>
          <ul>
          {% for grade in grades %}
          <li><a href="/students/{{ grade.id }}/">{{ grade.name }}</a></li>
          {% endfor %}
          </ul>
          </body>
          </html>
        • 路由
          1
          url(r'^students/(\d+)/$', views.gradeStudents),
        • 视图
          1
          2
          3
          def gradeStudents(request, gid):
          stus = Student.objects.filter(grade_id=gid)
          return render(request, 'myApp/students.html', {"stus": stus})

修改模型

  • 期间修改模型,一般直接生成迁移文件再迁移即可。如果出现无法生成迁移文件或者无法迁移时:
    1. 第一种方案,删除数据,重新创建,删除所有的迁移文件重新操作。
    2. 第二种方案,删除有问题的迁移文件,修改迁移记录,再重新操作。