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),
相關文章
相關標籤/搜索