天天看點

Django初識 學習筆記一

Django初識 學習筆記一

mvcviewsmodelstemplate.

一 MVC架構

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟體設計典範,用一種業務邏輯、資料、界面顯示分離的方法組織代碼,将業務邏輯聚集到一個部件裡面,在改進和個性化定制界面及使用者互動的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用于映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化使用者界面的結構中。

Django初識 學習筆記一

enter description here

  • Model(模型)是應用程式中用于處理應用程式資料邏輯的部分。

      通常模型對象負責在資料庫中存取資料。

  • View(視圖)是應用程式中處理資料顯示的部分。

      通常視圖是依據模型資料建立的。和html頁面有關系。

  • Controller(控制器)是應用程式中處理使用者互動的部分。

      通常控制器負責從視圖讀取資料,控制使用者輸入,并向模型發送資料。接受請求,進行互動,與M和V進行互動,傳回應答。

    二 MVT架構

    Django也是MVC架構。 但是,Django架構(内部的URLconf)作為控制器的角色,負責了接收使用者請求和轉發請求的工作,Django 裡更關注的是模型(Model)、模闆(Template)和視圖(Views),故稱之為 Django MVT 模式處理過程: Django架構接收了使用者請求和參數後,再通過正規表達式比對URL,轉發給對應視圖進行處理。視圖調用M處理資料,再調用T傳回界面給浏覽器;
    Django初識 學習筆記一
    enter description here
  • M:Model,模型, 和資料庫進行互動,和MVC中M功能相同
  • V: View,視圖, 接受請求,進行互動,與M和V進行互動,傳回應答 和MVC中C 功能相同
  • T: Template,模闆,産生html頁面,和MVC中的v功能相同

三 第一個Django項目

指令:django-admin startproject 項目名

項目目錄如下:

Django初識 學習筆記一

enter description here

  • _init_.py: 說明test1是一個python包。
  • settings.py: 項目的配置檔案
  • urls.py: 進行url路由的配置
  • wsgi.py: web伺服器和django互動的入口
  • manage.py: 項目的管理檔案

一個項目由很多個應用組成的,每一個應用完成一個特定的功能。

建立應用的指令如下:

python manage.py startapp 應用名

應用目錄如下:

Django初識 學習筆記一

enter description here

  • _init_.py: 說明目錄是一個python子產品
  • models.py: 寫和資料庫相關的内容
  • views.py: 接收請求,進行處理。和M,T互動,傳回應答,
  • 定義處理函數,視圖函數

tests.py:寫測試代碼的函數

admin.py: 網站背景管理相關的檔案

建立應用和項目之間的聯系,需要對應用進行注冊。(項目不知道應用在)

修改settings.py中的INSTALLED_APPS配置項。

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'booktest', # 進行應用的注冊
)           

運作開發web伺服器指令:

python manage.py runserver           

四 ORM

ORM:Object Relational Mapping(關系對象映射)

django中内嵌了ORM架構,ORM架構可以将類和資料表進行對應起來,隻需要通過類和對象就可以對資料表進行操作。

設計類:模型類。

ORM另外一個作用:根據設計的類生成資料庫中的表。

它的作用是在關系型資料庫和業務實體對象之間作一個映射,這樣,我們在具體的操作業務對象的時候,就不需要再去和複雜的SQL語句打交道,隻需簡單的操作對象的屬性和方法。

4.1 模型類設計

在應用models.py中設計模型類。必須繼承與models.Model類。

1) 設計BookInfo類。

2) 設計HeroInfo類。

Models.ForeignKey可以建立兩個模型類之間一對多的關系,django在生成表的時候,就會在多的表中建立一列作為外鍵,建立兩個表之間一對多的關系。

from django.db import models
# 設計和表對應的類,模型類
# Create your models here.

# 一類
# 圖書類
class BookInfo(models.Model):
    '''圖書模型類'''
    # 圖書名稱,CharField說明是一個字元串,max_length指定字元串的最大長度
    btitle = models.CharField(max_length=20)
    # 出版日期,DateField說明是一個日期類型
    bpub_date = models.DateField()

    def __str__(self):
        # 傳回書名
        return self.btitle

# 多類
# 英雄人物類
# 英雄名 hname
# 性别 hgender
# 年齡 hage
# 備注 hcomment
# 關系屬性 hbook,建立圖書類和英雄人物類之間的一對多關系
class HeroInfo(models.Model):
    '''英雄人物模型類'''
    hname = models.CharField(max_length=20) # 英雄名稱
    # 性别,BooleanField說明是bool類型,default指定預設值,False代表男
    hgender = models.BooleanField(default=False)
    # 備注
    hcomment = models.CharField(max_length=128)
    # 關系屬性 hbook,建立圖書類和英雄人物類之間的一對多關系
    # 關系屬性對應的表的字段名格式: 關系屬性名_id
    hbook = models.ForeignKey('BookInfo')

    def __str__(self):
        # 傳回英雄名
        return self.hname           

4.2 模型類生成表

1) 生成遷移檔案

指令:

python manage.py makemigrations

Django初識 學習筆記一

enter description here

遷移檔案是根據模型類生成的。

2) 執行遷移生成表

指令:

python mange.py migrate

根據遷移檔案生成表。

生成表名的預設格式:

應用名_模型類名小寫

4.3 通過模型類操作資料表

進入項目shell的指令:

python manage.py shell           

4.4 以下為在互相shell終端中示範的例子:

首先導入模型類:

from booktest.models import BookInfo,HeroInfo

1)向booktest_bookinfo表中插入一條資料。

b = BookInfo() #定義一個BookInfo類的對象

b.btitle ='天龍八部' #定義b對象的屬性并指派

b.bpub_date = date(1990,10,11)

b.save() #才會将資料儲存進資料庫

2)查詢出booktest_bookinfo表中id為1的資料。

b = BookInfo.objects.get(id=1)

3)在上一步的基礎上改變b對應圖書的出版日期。

b.bpub_date = date(1989,10,21)

b.save() #才會更新表格中的資料

4)緊接上一步,删除b對應的圖書的資料。

b.delete() #才會删除

5)向booktest_heroInfo表中插入一條資料。

h = HeroInfo()

h.hname = '郭靖'

h.hgender = False

h.hcomment = ‘降龍十八掌’

b2 = BookInfo.objects.get(id=2)

h.hbook = b2 #給關系屬性指派,英雄對象所屬的圖書對象

h.save()

6)查詢圖書表裡面的所有内容。

BookInfo.objects.all()

HeroInfo.objects.all()

4.5 關系操作

Django初識 學習筆記一

enter description here

1)查詢出id為2的圖書中所有英雄人物的資訊。

b = BookInfo.objects.get(id=2)

b.heroinfo_set.all() #查詢出b圖書中所有英雄人物的資訊

五 背景管理

1) 本地化

語言和時區的本地化。

修改settings.py檔案。

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 使用中文

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 中國時間           

2) 建立管理者

指令:

python manage.py createsuperuser

C:\Django\test1>python manage.py createsuperuser

You have 3 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth.
Run 'python manage.py migrate' to apply them.
Username (leave blank to use 't_maj'): admin
Error: That username is already taken.
Username (leave blank to use 't_maj'): Cosmo
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.           

3) 注冊模型類

在應用下的admin.py中注冊模型類。

告訴djang架構根據注冊的模型類來生成對應表管理頁面。

b = BookInfo()

str(b) str

4) 自定義管理頁面

自定義模型管理類。模型管理類就是告訴django在生成的管理頁面上顯示哪些内容。

六 視圖

在Django中,通過浏覽器去請求一個頁面時,使用視圖函數來處理這個請求的,視圖函數處理之後,要給浏覽器傳回頁面内容。

6.1 視圖函數的使用

1)定義視圖函數

視圖函數定義在views.py中。

例:

def index(request):
            #進行處理。。。
            return HttpResponse('hello python')           

視圖函數必須有一個參數request,進行處理之後,需要傳回一個HttpResponse的類對象,hello python就是傳回給浏覽器顯示的内容。

2)進行url配置

Django初識 學習筆記一

enter description here

url配置的目的是讓建立url和視圖函數的對應關系。url配置項定義在urlpatterns的清單中,每一個配置項都調用url函數。

url函數有兩個參數,第一個參數是一個正規表達式,第二個是對應的處理動作。

配置url時,有兩種文法格式:

a) url(正規表達式,視圖函數名)

b) url(正規表達式,include(應用中的urls檔案))

工作中在配置url時,首先在項目的urls.py檔案中添加配置項時,并不寫具體的url和視圖函數之間的對應關系,而是包含具體應用的urls.py檔案,在應用的urls.py檔案中寫url和視圖函數的對應關系。

項目的url.py:

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)), # 配置項目
    url(r'^', include('booktest.urls')), # 包含booktest應用中的urls檔案
]           

應用的url.py:

urlpatterns = [
    # 通過url函數設定url路由配置項
    url(r'^index$', views.index), # 建立/index和視圖index之間的關系
    url(r'^index2$', views.index2),
    url(r'^books$', views.show_books), # 顯示圖書資訊
    url(r'^books/(\d+)$', views.detail), # 顯示英雄資訊
]           

6.2 url比對的過程

在項目的urls.py檔案中包含具體應用的urls.py檔案,應用的urls.py檔案中寫url和視圖函數的對應關系。

Django初識 學習筆記一

enter description here

當使用者輸入如http://127.0.0.1:8000/aindex時,去除域名和最前面的/,剩下aindex,拿aindex字元串到項目的urls檔案中進行比對,配置成功之後,去除比對的a字元,那剩下的index字元串繼續到項目的urls檔案中進行正則比對,比對成功之後執行視圖函數index,index視圖函數傳回内容hello python給浏覽器來顯示。

七 模闆

模闆不僅僅是一個html檔案。

7.1 模闆檔案的使用

1) 建立模闆檔案夾

2) 配置模闆目錄

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], # 設定模闆檔案目錄
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]           

使用模闆檔案

a) 加載模闆檔案

去模闆目錄下面擷取html檔案的内容,得到一個模闆對象。

b) 定義模闆上下文

向模闆檔案傳遞資料。

c) 模闆渲染

得到一個标準的html内容。

from django.template import loader,RequestContext
def my_render(request, template_path, context_dict={}):
    '''使用模闆檔案'''
    # 使用模闆檔案
    # 1.加載模闆檔案, 模闆對象
    temp = loader.get_template(template_path)
    # 2.定義模闆上下文:給模闆檔案傳遞資料
    context = RequestContext(request, context_dict)
    # 3.模闆渲染:産生标準的html内容
    res_html = temp.render(context)
    # 4.傳回給浏覽器
    return HttpResponse(res_html)           

7.2 給模闆檔案傳遞資料

模闆變量使用:{{ 模闆變量名 }}

模闆代碼段:{%代碼段%}

for循環:

{% for i in list %}

{% endfor %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模闆檔案</title>
</head>
<body>
<h1>這是一個模闆檔案</h1>
使用模闆變量:<br/>
{{ content }}<br/>
使用清單:<br/>
{{ list }}<br/>
for循環:<br/>
<ul>
    {% for i in list %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>
</body>
</html>           

八 模型

8.1 Django ORM

Django初識 學習筆記一

enter description here

O:(objects)->類和對象。

R:(Relation)->關系,關系資料庫中的表格。

M:(Mapping)->映射。

ORM架構的功能:

a) 能夠允許我們通過面向對象的方式來操作資料庫。

b) 可以根據我們設計的模型類幫我們自動生成資料庫中的表格。

c) 通過友善的配置就可以進行資料庫的切換。

8.2 資料庫配置

mysql指令回顧:

登入mysql資料庫:mysql –uroot –p

檢視有哪些資料庫:show databases;

建立資料庫:create database test2 charset=utf8; #切記:指定編碼

使用資料庫:use test2;

檢視資料庫中的表:show tables;

Django配置使用mysql資料庫:

修改settings.py中的DATABASES。

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'NAME': 'bj18', # 使用的資料庫的名字,資料庫必須手動建立
        'USER': 'root', # 連結mysql的使用者名
        'PASSWORD': 'mysql', # 使用者對應的密碼
        'HOST': 'localhost', # 指定mysql資料庫所在電腦ip
        'PORT': 3306, # mysql服務的端口号
    }
}           

注意:django架構不會自動幫我們生成mysql資料庫,是以我們需要自己去建立。

8.3 切換mysql資料庫之後不能啟動伺服器

需要安裝操作mysql資料庫的包,python2環境和python3環境有以下差別。

a) python2需要安裝mysql-python:

pip install mysql-python           

b) python3需要安裝pymysql:

pip install pymysql           

python3中安裝好pymysql,需要在test2/init.py中加如下内容:

import pymysql
pymysql.install_as_MySQLdb()           

8.4 複習案例

  1. 設計模型類并生成表

    a) 設計BookInfo,增加屬性bread和bcomment,另外設定軟删除标記屬性isDelete。

    b) 設計HeroInfo類,增加軟删除标記屬性isDelete。

    軟删除标記:删除資料時不做真正的删除,而是把标記資料設定為1表示删除,目的是防止重要的資料丢失。

  2. 編寫視圖函數并配置URL。

    3)建立模闆檔案。

    拆解功能:

  3. 圖書資訊展示頁。

    a) 設計url,通過浏覽器通路 http://127.0.0.1:8000/index時顯示圖書資訊頁面。

    b) 設計url對應的視圖函數index。

    查詢出所有圖書的資訊,将這些資訊傳遞給模闆檔案。

    c) 編寫模闆檔案index.html。

    周遊顯示出每一本圖書的資訊并增加建立和删除超連結。

    2)圖書資訊新增。

    a)設計url,通過浏覽器通路 http://127.0.0.1:8000/create/時向資料庫中新增一條圖書資訊。

    b) 設計url對應得視圖函數create。

    Django初識 學習筆記一

    enter description here

    頁面重定向:伺服器不傳回頁面,而是告訴浏覽器再去請求其他的url位址。

    3)圖書資訊删除。

    a)設計url,通過浏覽器通路 http://127.0.0.1:8000/delete數字/删除資料庫中對應的一條圖書資料。

    其中數字是點選的圖書的id。

    b)設計url對應的視圖函數delete。

    擷取圖書的id,進行删除。