1-Django基本流程走通

1-Django基本流程走通

Django简介

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

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

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

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(模型):是应用程序中用于处理程序逻辑的部分,负责数据库中存储数据sql

View(视图):是应用程序中处理数据显示的部分,一般视图是依据模型数据建立的shell

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

MVC图解

Django的MTV

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

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

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

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

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),
相关文章
相关标签/搜索