1

1-Django基本流程走通

Django简介

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

MVC:MVC是一种软件设计典范,核心思想是解耦

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

Django与python版本对应关系

Django Version Pyhton Version
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

MVC

Model(模型):是应用程序中用于处理程序逻辑的部分,负责数据库中存储数据

View(视图):是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的

Controller(控制器):是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

MVC图解

Django的MTV

本质与MVC模式没有区别,只是定义形式不同

Model(模型):负责业务对象与数据库的对象(ORM)

Template(模板):负责如何把页面展示给用户

View(视图):负责业务逻辑,并在适当的时候调用Model和Template

MTV图解

clipboard.png

创建工程

# 黑屏终端,进入指定目录 创建工程
django-admin  startproject  project

clipboard.png

数据库配置

setting.py中配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',        #数据库名字
        'USER': 'root',          #账号
        'PASSWORD': '123456',    #密码
        'HOST': '127.0.0.1',     #IP
        'PORT': '3306',          #端口
    }
}

__init__.py文件中写入以下两行代码:

  import pymsql
  pymsql.install_as_Mysqldb()

或者安装pip install mysqlclient或者pip install mysql-python

安装出错可以到http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python下载对应版本安装。

创建应用

在一个工程中可以创建一个到多个应用,每个应用处理一种业务逻辑

打开黑屏终端进入工程目录下 python manage.py startapp myApp

目录结构:

├── db.sqlite3   # 数据库
├── myApp   # 一个应用
│   ├── admin.py  # 管理
│   ├── apps.py   # 应用的配置
│   ├── __init__.py
│   ├── migrations  # model到数据库映射的中间文件
│   │   └── __init__.py
│   ├── models.py  # model
│   ├── tests.py   # 在这里可以写测试代码
│   └── views.py   # 视图
├── project  #  创建项目时创建的目录
│   ├── __init__.py
│   ├── settings.py  # 项目的配置文件
│   ├── urls.py  # 根路由
│   └── wsgi.py   
└── manage.py
# setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myApp',
]

启动服务

python manage.py runserver ip:port

ip可以不写 python manage.py runserver

端口默认8000,可以单独修改 python manage.py runserver port

定义模型

modeles.py

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)

    def __str__(self):
        return self.name


class Student(models.Model):
    name = models.CharField(max_length=20)
    sex = models.BooleanField()
    age = models.IntegerField()
    content = models.CharField(max_length=40)
    # 关联类名的小写加引号或者直接类名
    grade = models.ForeignKey('grade')
    isDelete = models.BooleanField(default=False)

    def __str__(self):
        return self.name

说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长

生成数据表

生成迁移文件:python manage.py makemigrations [app名字]
作用: 在应用目录下的migrations目录下成迁移文件

执行迁移: python manage.py migrate [app名字]
作用:相当于执行sql语句生成数据表,表名为 应用名全小写_类名全小写

查看建表语句: python manage.py sqlmigrate app名字 0001 
说明:0001为makemigrations之后产生了0001_initial.py文件

模型操作数据库

# 进入pyhton shell模式 
python manage.py shell

# 引入包
from myApp.models import Grade,Student

# 增
>>> grade = Grade()
>>> grade.name = "python01"
>>> grade.boyNum = 50
>>> grade.girlNum = 10
>>> grade.save()
>>> stu = Student()
>>> stu.name = "sunck"
>>> stu.sex = "True"
>>> stu.age = 18
>>> stu.contend = "sunck is a good man"
>>> stu.grade = grade
>>> stu.save()

# 删
stu.delete()

# 改
>>> stu.age = 17
>>> stu.save()

# 查
stus = Student.objects.all()
grade = Grade.objects.get(pk=1)

视图的基本使用

概述:

在Django中视图对WEB请求进行响应的,视图的本质是python中的函数,在views.py文件中定义,

视图接收request对象作为第一个参数,包含了请求的信息

定义视图

view.py

from django.shortcuts import render
from django.http import HttpResponse
from myApp.models import Grade, Student

def index(request):
    return HttpResponse("sunck is a good man")
def detail(request, num):
    return HttpResponse("detail %s" % num)
HttpRequest对象的属性
path:       请求页面的全路径,不包括域名
method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如
if request.method == "GET":
   do_something()
elif request.method == "POST":
   do_something_else()
      
GET:  包含所有HTTP  GET参数的类字典对象
POST:包含所有HTTP  POST参数的类字典对象

user:是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为         django.contrib.auth.models.AnonymousUser的实例(匿名用户)。你可以通过user的is_authenticated()方法来辨别      用户是否登陆:
        if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware时该属性才可用

session:唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。
COOKIES: 包含所有cookies的标准Python字典对象;keys和values都是字符串。
FILES:  包含所有上传文件的类字典对象;FILES中的每一个Key都是 <input type = "file"name = ""/> 标签中
         name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:

filename:      上传文件名,用字符串表示
content_type:   上传文件的ContentType
content:       上传文件的原始内容

配置路由

主路由:与工程名相同名字的目录下的urls.py文件

配置文件:ROOT_URLCONF = 'project.urls'

urls.py

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的文件
作用:路由分发,规定哪个网址由哪个视图处理

urls.py

from django.conf.urls import url
from myApp import views

urlpatterns = [
    # 路由匹配
    url(r'index/', views.index),
    url(r'detail/(\d+)/', views.detail),
]

模板的基本使用

概述:模板是HTML界面,可以根据视图传递的数据进行填充

创建模板目录:工程目录下创建名为templates的目录,也可以放在项目目录中

配置模板路径:

settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
    }

定义模板

grade.html

<!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>

student.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生信息</title>
</head>
<body>
    <h1>学生信息</h1>
    <ul>
        {% for stu in stusList %}
        <li>{{ stu.name }}--{{ stu.grade }}--{{ stu.age }}</li>
        {% endfor %}
    </ul>
</body>
</html>

在视图中返回模板

views.py

from myApp.models import Grade, Student
def students(request):
    #获取所有学生信息列表
    stus = Student.objects.all()
    return render(request, 'students.html', {"stusList":stus})

def grades(request):
    grades = Grade.objects.all()
    return render(request, 'grades.html', {'grades': grades})

def gstudents(request, gid):
    stus = Student.objects.filter(grade_id=gid)
    return render(request, "students.html", {"stusList":stus})

urls.py

url(r'students/grade/(\d+)/', views.gstudents),

rayzz
145 声望13 粉丝

« 上一篇
Cookie和Session
下一篇 »
2-django的模型