日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Django详解

發(fā)布時(shí)間:2024/3/26 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Django

  • 軟件框架
  • 一個(gè)公司是由公司中的各部部門(mén)來(lái)組成的,每一個(gè)部門(mén)擁有特定的職能,部門(mén)與部門(mén)之間通過(guò)相互的配合來(lái)完成讓公司運(yùn)轉(zhuǎn)起來(lái)。
    一個(gè)軟件框架是由其中各個(gè)軟件模塊組成的,每一個(gè)模塊都有特定的功能,模塊與模塊之間通過(guò)相互配合來(lái)完成軟件的開(kāi)發(fā)。
    軟件框架是針對(duì)某一類(lèi)軟件設(shè)計(jì)問(wèn)題而產(chǎn)生的。
    2. MVC框架
    2.1 MVC簡(jiǎn)介
    MVC最初是由施樂(lè)公司旗下的帕羅奧多研究中心中的一位研究人員給 smalltalk語(yǔ)言發(fā)明的一中軟件設(shè)計(jì)模式。
    MVC的產(chǎn)生理念: 分工。讓專(zhuān)門(mén)的人去做專(zhuān)門(mén)的事。
    MVC的核心思想: 解耦。

    MVC的思想被應(yīng)用在的web開(kāi)發(fā)的方面,產(chǎn)生了web MVC框架。

    2.2 Web MVC框架模塊功能
    通過(guò)瀏覽器注冊(cè)用戶信息。

    M:Model,模型, 和數(shù)據(jù)庫(kù)進(jìn)行交互。
    V:View,視圖, 產(chǎn)生html頁(yè)面。
    C:Controller,控制器, 接收請(qǐng)求,進(jìn)行處理,與M和V進(jìn)行交互,返回應(yīng)答。
    3. Django框架
    3.1 簡(jiǎn)介
    Django是勞倫斯出版集團(tuán)的開(kāi)發(fā)人員為開(kāi)發(fā)新聞內(nèi)容網(wǎng)站而設(shè)計(jì)出來(lái)的一個(gè)軟件,它遵循MVC思想,但是有自己的一個(gè)名詞,叫做MVT。
    Django遵循快速開(kāi)發(fā)和DRY原則。Do not repeat yourself.不要自己去重復(fù)一些工作。
    3.2 MVT各部分功能

    M:Model,模型, 和MVC中M功能相同,和數(shù)據(jù)庫(kù)進(jìn)行交互。
    V:View,視圖, 和MVC中C功能相同,接收請(qǐng)求,進(jìn)行處理,與M和T進(jìn)行交互,返回應(yīng)答。
    T:Template,模板, 和MVC中V功能相同,產(chǎn)生html頁(yè)面。
    4. 虛擬環(huán)境
    4.1 概念

    之前安裝python包的命令: sudo pip3 install 包名
    包的安裝路徑:/usr/local/lib/python3.5/dist-packages
    在同一個(gè)python環(huán)境中安裝同一個(gè)包的不同版本,后安裝的包會(huì)把原來(lái)安裝的包覆蓋掉。這樣,如果同一臺(tái)機(jī)器上兩個(gè)項(xiàng)目依賴(lài)于相同包的不同版本,則會(huì)導(dǎo)致一些項(xiàng)目運(yùn)行失敗。
    解決的方案就是:虛擬環(huán)境。
    虛擬環(huán)境是真實(shí)python環(huán)境的復(fù)制版本。
    在虛擬環(huán)境中使用的python是復(fù)制的python,安裝python包也是安裝在復(fù)制的python中。
    4.2 安裝和配置
    安裝虛擬環(huán)境的命令:
    1)sudo pip install virtualenv #安裝虛擬環(huán)境
    2)sudo pip install virtualenvwrapper #安裝虛擬環(huán)境擴(kuò)展包
    3)編輯家目錄下面的.bashrc文件,添加下面兩行。
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
    4)使用source .bashrc使其生效一下。
    4.3 使用
    創(chuàng)建虛擬環(huán)境命令:
    mkvirtualenv 虛擬環(huán)境名
    創(chuàng)建python3虛擬環(huán)境:
    mkvirtualenv -p python3 bj11_py3
    進(jìn)入虛擬環(huán)境工作:
    workon 虛擬環(huán)境名
    查看機(jī)器上有多少個(gè)虛擬環(huán)境:
    workon 空格 + 兩個(gè)tab鍵
    退出虛擬環(huán)境:
    deactivate
    刪除虛擬環(huán)境:
    rmvirtualenv 虛擬環(huán)境名
    虛擬環(huán)境下安裝包的命令:
    pip install 包名
    注意:不能使用sudo pip install 包名,這個(gè)命令會(huì)把包安裝到真實(shí)的主機(jī)環(huán)境上而不是安裝到虛擬環(huán)境中。
    查看虛擬環(huán)境中安裝了哪些python包:
    pip list
    pip freeze
    安裝django環(huán)境:
    pip install django==1.8.2
    拓展:
    apt-get install 軟件
    pip install python包名
    5. 項(xiàng)目創(chuàng)建
    5.1 創(chuàng)建Django項(xiàng)目
    命令:django-admin startproject 項(xiàng)目名
    注意:創(chuàng)建應(yīng)用必須先進(jìn)入虛擬環(huán)境。
    項(xiàng)目目錄如下:

    init.py: 說(shuō)明test1是一個(gè)python包。
    settings.py: 項(xiàng)目的配置文件。
    urls.py: 進(jìn)行url路由的配置。
    wsgi.py: web服務(wù)器和Django交互的入口。
    manage.py: 項(xiàng)目的管理文件。
    5.2 創(chuàng)建Django應(yīng)用

    一個(gè)項(xiàng)目由很多個(gè)應(yīng)用組成的,每一個(gè)應(yīng)用完成一個(gè)功能模塊。
    創(chuàng)建應(yīng)用的命令如下:
    python manage.py startapp 應(yīng)用名
    注意:創(chuàng)建應(yīng)用時(shí)需要先進(jìn)入項(xiàng)目目錄。
    應(yīng)用目錄如下:

    init.py: 說(shuō)明目錄是一個(gè)Python模塊。
    models.py: 寫(xiě)和數(shù)據(jù)庫(kù)項(xiàng)目的內(nèi)容, 設(shè)計(jì)模型類(lèi)。
    views.py: ,接收請(qǐng)求,進(jìn)行處理,與M和T進(jìn)行交互,返回應(yīng)答。
    定義處理函數(shù),視圖函數(shù)。
    tests.py: 寫(xiě)測(cè)試代碼的文件。
    admin.py: 網(wǎng)站后臺(tái)管理相關(guān)的文件。
    5.3 應(yīng)用注冊(cè)
    建立應(yīng)用和項(xiàng)目之間的聯(lián)系,需要對(duì)應(yīng)用進(jìn)行注冊(cè)。
    修改settings.py中的INSTALLED_APPS配置項(xiàng)。
    5.4 啟動(dòng)項(xiàng)目
    運(yùn)行開(kāi)發(fā)web服務(wù)器命令:
    python manage.py runserver
    6. 模型類(lèi)
    6.1 ORM

    django中內(nèi)嵌了ORM框架,ORM框架可以將類(lèi)和數(shù)據(jù)表進(jìn)行對(duì)應(yīng)起來(lái),只需要通過(guò)類(lèi)和對(duì)象就可以對(duì)數(shù)據(jù)表進(jìn)行操作。
    在Django中主要是設(shè)計(jì)類(lèi):模型類(lèi)。
    ORM另外一個(gè)作用:根據(jù)設(shè)計(jì)的類(lèi)生成數(shù)據(jù)庫(kù)中的表。
    6.2 模型類(lèi)設(shè)計(jì)
    在應(yīng)用models.py中設(shè)計(jì)模型類(lèi)。
    必須繼承與models.Model類(lèi)。
    1) 設(shè)計(jì)BookInfo類(lèi)。
    2) 設(shè)計(jì)HeroInfo類(lèi)。
    Models.ForeignKey可以建立兩個(gè)模型類(lèi)之間一對(duì)多的關(guān)系,django在生成表的時(shí)候,就會(huì)在多端的表中創(chuàng)建一列作為外鍵,建立兩個(gè)表之間一對(duì)多的關(guān)系。
    6.3 模型類(lèi)生成表

  • 生成遷移文件
    命令:python manage.py makemigrations
  • 遷移文件是根據(jù)模型類(lèi)生成的。
    2) 執(zhí)行遷移生成表
    命令:python mange.py migrate
    根據(jù)遷移文件生成表。
    生成表名的默認(rèn)格式:
    應(yīng)用名_模型類(lèi)名小寫(xiě)
    6.4 通過(guò)模型類(lèi)操作數(shù)據(jù)表
    進(jìn)入項(xiàng)目shell的命令:
    python manage.py shell
    以下為在相互shell終端中演示的例子:
    首先導(dǎo)入模型類(lèi):
    from booktest.models import BookInfo,HeroInfo

  • 向booktest_bookinfo表中插入一條數(shù)據(jù)。
    b = BookInfo() #定義一個(gè)BookInfo類(lèi)的對(duì)象
    b.btitle =‘天龍八部’ #定義b對(duì)象的屬性并賦值
    b.bpub_date = date(1990,10,11)
    b.save() #才會(huì)將數(shù)據(jù)保存進(jìn)數(shù)據(jù)庫(kù)
  • 查詢(xún)出booktest_bookinfo表中id為1的數(shù)據(jù)。
    b = BookInfo.objects.get(id=1)
  • 在上一步的基礎(chǔ)上改變b對(duì)應(yīng)圖書(shū)的出版日期。
    b.bpub_date = date(1989,10,21)
    b.save() #才會(huì)更新表格中的數(shù)據(jù)
  • 緊接上一步,刪除b對(duì)應(yīng)的圖書(shū)的數(shù)據(jù)。
    b.delete() #才會(huì)刪除
  • 向booktest_heroInfo表中插入一條數(shù)據(jù)。
    h = HeroInfo()
    h.hname = ‘郭靖’
    h.hgender = False
    h.hcomment = ‘降龍十八掌’
    b2 = BookInfo.objects.get(id=2)
    h.hbook = b2 #給關(guān)系屬性賦值,英雄對(duì)象所屬的圖書(shū)對(duì)象
    h.save()
  • 查詢(xún)圖書(shū)表里面的所有內(nèi)容。
    BookInfo.objects.all()
    HeroInfo.objects.all()
    6.5 關(guān)聯(lián)操作
  • 查詢(xún)出id為2的圖書(shū)中所有英雄人物的信息。
    b = BookInfo.objects.get(id=2)
    b.heroinfo_set.all() #查詢(xún)出b圖書(shū)中所有英雄人物的信息
  • 后臺(tái)管理
  • 本地化
    語(yǔ)言和時(shí)區(qū)的本地化。
    修改settings.py文件。
  • 創(chuàng)建管理員
    命令:python manage.py createsuperuser
  • 注冊(cè)模型類(lèi)
    在應(yīng)用下的admin.py中注冊(cè)模型類(lèi)。
    告訴djang框架根據(jù)注冊(cè)的模型類(lèi)來(lái)生成對(duì)應(yīng)表管理頁(yè)面。
    b = BookInfo()
    str(b) str
  • 自定義管理頁(yè)面
    自定義模型管理類(lèi)。模型管理類(lèi)就是告訴django在生成的管理頁(yè)面上顯示哪些內(nèi)容。
  • 視圖
    在Django中,通過(guò)瀏覽器去請(qǐng)求一個(gè)頁(yè)面時(shí),使用視圖函數(shù)來(lái)處理這個(gè)請(qǐng)求的,視圖函數(shù)處理之后,要給瀏覽器返回頁(yè)面內(nèi)容。
    8.1視圖函數(shù)的使用
  • 定義視圖函數(shù)
    視圖函數(shù)定義在views.py中。
    例:
    def index(request):
    #進(jìn)行處理。。。
    return HttpResponse(‘hello python’)
    視圖函數(shù)必須有一個(gè)參數(shù)request,進(jìn)行處理之后,需要返回一個(gè)HttpResponse的類(lèi)對(duì)象,hello python就是返回給瀏覽器顯示的內(nèi)容。

  • 進(jìn)行url配置

    url配置的目的是讓建立url和視圖函數(shù)的對(duì)應(yīng)關(guān)系。url配置項(xiàng)定義在urlpatterns的列表中,每一個(gè)配置項(xiàng)都調(diào)用url函數(shù)。
    url函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)正則表達(dá)式,第二個(gè)是對(duì)應(yīng)的處理動(dòng)作。
    配置url時(shí),有兩種語(yǔ)法格式:
    a) url(正則表達(dá)式,視圖函數(shù)名)
    b) url(正則表達(dá)式,include(應(yīng)用中的urls文件))
    工作中在配置url時(shí),首先在項(xiàng)目的urls.py文件中添加配置項(xiàng)時(shí),并不寫(xiě)具體的url和視圖函數(shù)之間的對(duì)應(yīng)關(guān)系,而是包含具體應(yīng)用的urls.py文件,在應(yīng)用的urls.py文件中寫(xiě)url和視圖函數(shù)的對(duì)應(yīng)關(guān)系。
    8.2 url匹配的過(guò)程
    在項(xiàng)目的urls.py文件中包含具體應(yīng)用的urls.py文件,應(yīng)用的urls.py文件中寫(xiě)url和視圖函數(shù)的對(duì)應(yīng)關(guān)系。

  • 當(dāng)用戶輸入如http://127.0.0.1:8000/aindex時(shí),去除域名和最前面的/,剩下aindex,拿aindex字符串到項(xiàng)目的urls文件中進(jìn)行匹配,配置成功之后,去除匹配的a字符,那剩下的index字符串繼續(xù)到應(yīng)用的urls文件中進(jìn)行正則匹配,匹配成功之后執(zhí)行視圖函數(shù)index,index視圖函數(shù)返回內(nèi)容hello python給瀏覽器來(lái)顯示。
    9. 模板
    模板不僅僅是一個(gè)html文件。
    9.1 模板文件的使用

  • 創(chuàng)建模板文件夾
  • 配置模板目錄
  • 使用模板文件
    a) 加載模板文件
    去模板目錄下面獲取html文件的內(nèi)容,得到一個(gè)模板對(duì)象。
    b) 定義模板上下文
    向模板文件傳遞數(shù)據(jù)。
    c) 模板渲染
    得到一個(gè)標(biāo)準(zhǔn)的html內(nèi)容。
    9.2 給模板文件傳遞數(shù)據(jù)
    模板變量使用:{{ 模板變量名 }}
    模板代碼段:{%代碼段%}
    for循環(huán):
    {% for i in list %}
    list不為空時(shí)執(zhí)行的邏輯
    {% empty %}
    list為空時(shí)執(zhí)行的邏輯
    {% endfor %}
  • 案例完成
    編碼之前的準(zhǔn)備工作:
  • 設(shè)計(jì)出訪問(wèn)頁(yè)面的url和對(duì)應(yīng)的視圖函數(shù)的名字,確定視圖函數(shù)的功能。
  • 設(shè)計(jì)模板文件的名字。
    以下為案例中的簡(jiǎn)單設(shè)計(jì)過(guò)程:
  • 完成圖書(shū)信息的展示:
    a) 設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/books 時(shí)顯示圖書(shū)信息頁(yè)面。
    b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)show_books。
    查詢(xún)出所有圖書(shū)的信息,將這些信息傳遞給模板文件。
    c) 編寫(xiě)模板文件show_books.html。
    遍歷顯示出每一本圖書(shū)的信息。
  • 完成點(diǎn)擊某本圖書(shū)時(shí),顯示出圖書(shū)里所有英雄信息的頁(yè)面。
    a) 設(shè)計(jì)url,通過(guò)訪問(wèn)http://127.0.0.1:8000/books/數(shù)字時(shí)顯示對(duì)應(yīng)的英雄信息頁(yè)面。
    這里數(shù)字指點(diǎn)擊的圖書(shū)的id。
    b) 設(shè)計(jì)對(duì)應(yīng)的視圖函數(shù)detail。
    接收?qǐng)D書(shū)的id,根據(jù)id查詢(xún)出相應(yīng)的圖書(shū)信息,然后查詢(xún)出圖書(shū)中的所有英雄信息。
    c) 編寫(xiě)模板文件detail.html。
    模型
  • Django ORM
  • O(objects):類(lèi)和對(duì)象。
    R(Relation):關(guān)系,關(guān)系數(shù)據(jù)庫(kù)中的表格。
    M(Mapping):映射。
    Django ORM框架的功能:
    a) 建立模型類(lèi)和表之間的對(duì)應(yīng)關(guān)系,允許我們通過(guò)面向?qū)ο蟮姆绞絹?lái)操作數(shù)據(jù)庫(kù)。
    b) 根據(jù)設(shè)計(jì)的模型類(lèi)生成數(shù)據(jù)庫(kù)中的表格。
    c) 通過(guò)方便的配置就可以進(jìn)行數(shù)據(jù)庫(kù)的切換。
    2. Django數(shù)據(jù)庫(kù)配置
    2.1 mysql命令回顧
    登錄mysql數(shù)據(jù)庫(kù):mysql –uroot –p
    查看有哪些數(shù)據(jù)庫(kù):show databases
    創(chuàng)建數(shù)據(jù)庫(kù):create database test2 charset=utf8; #切記:指定編碼
    使用數(shù)據(jù)庫(kù):use test2;
    查看數(shù)據(jù)庫(kù)中的表:show tables;
    2.2 Django配置使用mysql數(shù)據(jù)庫(kù)
    修改settings.py中的DATABASES。

    注意:django框架不會(huì)自動(dòng)幫我們生成mysql數(shù)據(jù)庫(kù),所以我們需要自己去創(chuàng)建。
    2.3 切換mysql數(shù)據(jù)庫(kù)之后不能啟動(dòng)服務(wù)器
    需要安裝操作mysql數(shù)據(jù)庫(kù)的包,python2環(huán)境和python3環(huán)境有以下區(qū)別。
    a) python2需要安裝mysql-python:
    pip install mysql-python
    b) python3需要安裝pymysql:
    pip install pymysql
    python3中安裝好pymysql,需要在test2/init.py中加如下內(nèi)容:
    import pymysql
    pymysql.install_as_MySQLdb()
    3. 復(fù)習(xí)案例

  • 設(shè)計(jì)模型類(lèi)并生成表
    a) 設(shè)計(jì)BookInfo,增加屬性bread和bcomment,另外設(shè)置軟刪除標(biāo)記屬性isDelete。
    b) 設(shè)計(jì)HeroInfo類(lèi),增加軟刪除標(biāo)記屬性isDelete。
    軟刪除標(biāo)記:刪除數(shù)據(jù)時(shí)不做真正的刪除,而是把標(biāo)記數(shù)據(jù)設(shè)置為1表示刪除,目的是防止重要的數(shù)據(jù)丟失。
  • 編寫(xiě)視圖函數(shù)并配置URL。
    3)創(chuàng)建模板文件。
    拆解功能:
  • 圖書(shū)信息展示頁(yè)。
    a) 設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/index時(shí)顯示圖書(shū)信息頁(yè)面。
    b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)index。
    查詢(xún)出所有圖書(shū)的信息,將這些信息傳遞給模板文件。
    c) 編寫(xiě)模板文件index.html。
    遍歷顯示出每一本圖書(shū)的信息并增加新建和刪除超鏈接。
    2)圖書(shū)信息新增。
    a)設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/create時(shí)向數(shù)據(jù)庫(kù)中新增一條圖書(shū)信息。
    b) 設(shè)計(jì)url對(duì)應(yīng)得視圖函數(shù)create。
  • 頁(yè)面重定向:服務(wù)器不返回頁(yè)面,而是告訴瀏覽器再去請(qǐng)求其他的url地址。
    3)圖書(shū)信息刪除。
    a)設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/delete數(shù)字刪除數(shù)據(jù)庫(kù)中對(duì)應(yīng)的一條圖書(shū)數(shù)據(jù)。
    其中數(shù)字是點(diǎn)擊的圖書(shū)的id。
    b)設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)delete。
    獲取圖書(shū)的id,進(jìn)行刪除。
    4. 字段屬性和選項(xiàng)
    4.1 模型類(lèi)屬性命名限制
    1)不能是python的保留關(guān)鍵字。
    2)不允許使用連續(xù)的下劃線,這是由django的查詢(xún)方式?jīng)Q定的。
    3)定義屬性時(shí)需要指定字段類(lèi)型,通過(guò)字段類(lèi)型的參數(shù)指定選項(xiàng),語(yǔ)法如下:
    屬性名=models.字段類(lèi)型(選項(xiàng))
    4.2 字段類(lèi)型
    使用時(shí)需要引入django.db.models包,字段類(lèi)型如下:
    類(lèi)型 描述
    AutoField 自動(dòng)增長(zhǎng)的IntegerField,通常不用指定,不指定時(shí)Django會(huì)自動(dòng)創(chuàng)建屬性名為id的自動(dòng)增長(zhǎng)屬性。
    BooleanField 布爾字段,值為T(mén)rue或False。
    NullBooleanField 支持Null、True、False三種值。
    CharField(max_length=最大長(zhǎng)度) 字符串。參數(shù)max_length表示最大字符個(gè)數(shù)。
    TextField 大文本字段,一般超過(guò)4000個(gè)字符時(shí)使用。
    IntegerField 整數(shù)
    DecimalField(max_digits=None, decimal_places=None) 十進(jìn)制浮點(diǎn)數(shù)。參數(shù)max_digits表示總位。參數(shù)decimal_places表示小數(shù)位數(shù)。
    FloatField 浮點(diǎn)數(shù)。參數(shù)同上
    DateField:([auto_now=False, auto_now_add=False]) 日期。
    1)參數(shù)auto_now表示每次保存對(duì)象時(shí),自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間,用于"最后一次修改"的時(shí)間戳,它總是使用當(dāng)前日期,默認(rèn)為false。
    2) 參數(shù)auto_now_add表示當(dāng)對(duì)象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間,用于創(chuàng)建的時(shí)間戳,它總是使用當(dāng)前日期,默認(rèn)為false。
    3)參數(shù)auto_now_add和auto_now是相互排斥的,組合將會(huì)發(fā)生錯(cuò)誤。
    TimeField 時(shí)間,參數(shù)同DateField。
    DateTimeField 日期時(shí)間,參數(shù)同DateField。
    FileField 上傳文件字段。
    ImageField 繼承于FileField,對(duì)上傳的內(nèi)容進(jìn)行校驗(yàn),確保是有效的圖片。
    4.3 選項(xiàng)
    通過(guò)選項(xiàng)實(shí)現(xiàn)對(duì)字段的約束,選項(xiàng)如下:
    選項(xiàng)名 描述
    default 默認(rèn)值。設(shè)置默認(rèn)值。
    primary_key 若為T(mén)rue,則該字段會(huì)成為模型的主鍵字段,默認(rèn)值是False,一般作為AutoField的選項(xiàng)使用。
    unique 如果為T(mén)rue, 這個(gè)字段在表中必須有唯一值,默認(rèn)值是False。
    db_index 若值為T(mén)rue, 則在表中會(huì)為此字段創(chuàng)建索引,默認(rèn)值是False。
    db_column 字段的名稱(chēng),如果未指定,則使用屬性的名稱(chēng)。
    null 如果為T(mén)rue,表示允許為空,默認(rèn)值是False。
    blank 如果為T(mén)rue,則該字段允許為空白,默認(rèn)值是False。
    對(duì)比:null是數(shù)據(jù)庫(kù)范疇的概念,blank是后臺(tái)管理頁(yè)面表單驗(yàn)證范疇的。
    經(jīng)驗(yàn):
    當(dāng)修改模型類(lèi)之后,如果添加的選項(xiàng)不影響表的結(jié)構(gòu),則不需要重新做遷移,商品的選項(xiàng)中default和blank不影響表結(jié)構(gòu)。
    參考文檔:
    http://python.usyiyi.cn/translate/django_182/index.html
    5. 查詢(xún)
    5.1 mysql的日志文件
    mysql.log是mysql的日志文件,里面記錄的對(duì)MySQL數(shù)據(jù)庫(kù)的操作記錄。默認(rèn)情況下mysql的日志文件沒(méi)有產(chǎn)生,需要修改mysql的配置文件,步驟如下:

  • 使用下面的命令打開(kāi)mysql的配置文件,去除68,69行的注釋,然后保存。
    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
    2)重啟mysql服務(wù),就會(huì)產(chǎn)生mysql日志文件。
    sudo service mysql restart
    3)打開(kāi)MySQL的日志文件。
    /var/log/mysql/mysql.log 是mysql日志文件所在的位置。
    使用下面的命令可以實(shí)時(shí)查看mysql的日志文件:
    sudo tail -f /var/log/mysql/mysql.log
    5.2 查詢(xún)函數(shù)
    通過(guò)模型類(lèi).objects屬性可以調(diào)用如下函數(shù),實(shí)現(xiàn)對(duì)模型類(lèi)對(duì)應(yīng)的數(shù)據(jù)表的查詢(xún)。
    函數(shù)名 功能 返回值 說(shuō)明
    get 返回表中滿足條件的一條且只能有一條數(shù)據(jù)。 返回值是一個(gè)模型類(lèi)對(duì)象。 參數(shù)中寫(xiě)查詢(xún)條件。
  • 如果查到多條數(shù)據(jù),則拋異常MultipleObjectsReturned。
    2)查詢(xún)不到數(shù)據(jù),則拋異常:DoesNotExist。
    all 返回模型類(lèi)對(duì)應(yīng)表格中的所有數(shù)據(jù)。 返回值是QuerySet類(lèi)型 查詢(xún)集
    filter 返回滿足條件的數(shù)據(jù)。 返回值是QuerySet類(lèi)型 參數(shù)寫(xiě)查詢(xún)條件。
    exclude 返回不滿足條件的數(shù)據(jù)。 返回值是QuerySet類(lèi)型 參數(shù)寫(xiě)查詢(xún)條件。
    order_by 對(duì)查詢(xún)結(jié)果進(jìn)行排序。 返回值是QuerySet類(lèi)型 參數(shù)中寫(xiě)根據(jù)哪些字段進(jìn)行排序。
    get示例:
    例:查詢(xún)圖書(shū)id為3的圖書(shū)信息。
    all方法示例:
    例:查詢(xún)圖書(shū)所有信息。
    filter方法示例:
    條件格式:
    模型類(lèi)屬性名__條件名=值
    查詢(xún)圖書(shū)評(píng)論量為34的圖書(shū)的信息:
    a)判等 條件名:exact。
    例:查詢(xún)編號(hào)為1的圖書(shū)。
    BookInfo.objects.get(id=1)
    b)模糊查詢(xún)
    例:查詢(xún)書(shū)名包含’傳’的圖書(shū)。contains
    BookInfo.objects.filter(btitle__contains=‘傳’)
    例:查詢(xún)書(shū)名以’部’結(jié)尾的圖書(shū) endswith 開(kāi)頭:startswith
    BookInfo.objects.filter(btitle__endswith=‘部’)
    c)空查詢(xún) isnull
    例:查詢(xún)書(shū)名不為空的圖書(shū)。isnull
    select * from booktest_bookinfo where btitle is not null;
    BookInfo.objects.filter(btitle__isnull=False)
    d)范圍查詢(xún) in
    例:查詢(xún)id為1或3或5的圖書(shū)。
    select * from booktest_bookinfo where id in (1,3,5);
    BookInfo.objects.filter(id__in = [1,3,5])
    e)比較查詢(xún) gt(greate than) lt(less than) gte(equal) 大于等于
    lte 小于等于
    例:查詢(xún)id大于3的圖書(shū)。
    Select * from booktest_bookinfo where id>3;
    BookInfo.objects.filter(id__gt=3)
    f)日期查詢(xún)
    例:查詢(xún)1980年發(fā)表的圖書(shū)。
    BookInfo.objects.filter(bpub_date__year=1980)
    例:查詢(xún)1980年1月1日后發(fā)表的圖書(shū)。
    from datetime import date
    BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
    exclude方法示例:
    例:查詢(xún)id不為3的圖書(shū)信息。
    BookInfo.objects.exclude(id=3)
    order_by方法示例:
    作用:進(jìn)行查詢(xún)結(jié)果進(jìn)行排序。
    例:查詢(xún)所有圖書(shū)的信息,按照id從小到大進(jìn)行排序。
    BookInfo.objects.all().order_by(‘id’)
    例:查詢(xún)所有圖書(shū)的信息,按照id從大到小進(jìn)行排序。
    BookInfo.objects.all().order_by(’-id’)
    例:把id大于3的圖書(shū)信息按閱讀量從大到小排序顯示。
    BookInfo.objects.filter(id__gt=3).order_by(’-bread’)
  • F對(duì)象
    作用:用于類(lèi)屬性之間的比較。
    使用之前需要先導(dǎo)入:
    from django.db.models import F
    例:查詢(xún)圖書(shū)閱讀量大于評(píng)論量圖書(shū)信息。
    BookInfo.objects.filter(bread__gt=F(‘bcomment’))
    例:查詢(xún)圖書(shū)閱讀量大于2倍評(píng)論量圖書(shū)信息。
    BookInfo.objects.filter(bread__gt=F(‘bcomment’)*2)
  • Q對(duì)象
    作用:用于查詢(xún)時(shí)條件之間的邏輯關(guān)系。not and or,可以對(duì)Q對(duì)象進(jìn)行&|~操作。
    使用之前需要先導(dǎo)入:
    from django.db.models import Q
    例:查詢(xún)id大于3且閱讀量大于30的圖書(shū)的信息。
    BookInfo.objects.filter(id__gt=3, bread__gt=30)
    BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
    例:查詢(xún)id大于3或者閱讀量大于30的圖書(shū)的信息。
    BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
    例:查詢(xún)id不等于3圖書(shū)的信息。
    BookInfo.objects.filter(~Q(id=3))
  • 聚合函數(shù)
    作用:對(duì)查詢(xún)結(jié)果進(jìn)行聚合操作。
    sum count avg max min
    aggregate:調(diào)用這個(gè)函數(shù)來(lái)使用聚合。 返回值是一個(gè)字典
    使用前需先導(dǎo)入聚合類(lèi):
    from django.db.models import Sum,Count,Max,Min,Avg
    例:查詢(xún)所有圖書(shū)的數(shù)目。
    BookInfo.objects.all().aggregate(Count(‘id’))
    {‘id__count’: 5}
    例:查詢(xún)所有圖書(shū)閱讀量的總和。
    BookInfo.objects.aggregate(Sum(‘bread’))
    {‘bread__sum’: 126}
    count函數(shù) 返回值是一個(gè)數(shù)字
    作用:統(tǒng)計(jì)滿足條件數(shù)據(jù)的數(shù)目。
    例:統(tǒng)計(jì)所有圖書(shū)的數(shù)目。
    BookInfo.objects.all().count()
    BookInfo.objects.count()
    例:統(tǒng)計(jì)id大于3的所有圖書(shū)的數(shù)目。
    BookInfo.objects.filter(id__gt=3).count()
    小結(jié):
  • 參考文檔:
    http://python.usyiyi.cn/translate/django_182/ref/models/querysets.html
    9. 查詢(xún)集
    all, filter, exclude, order_by調(diào)用這些函數(shù)會(huì)產(chǎn)生一個(gè)查詢(xún)集,QuerySet類(lèi)對(duì)象可以繼續(xù)調(diào)用上面的所有函數(shù)。
    9.1 查詢(xún)集特性
    1) 惰性查詢(xún):只有在實(shí)際使用查詢(xún)集中的數(shù)據(jù)的時(shí)候才會(huì)發(fā)生對(duì)數(shù)據(jù)庫(kù)的真正查詢(xún)。
    2) 緩存:當(dāng)使用的是同一個(gè)查詢(xún)集時(shí),第一次使用的時(shí)候會(huì)發(fā)生實(shí)際數(shù)據(jù)庫(kù)的查詢(xún),然后把結(jié)果緩存起來(lái),之后再使用這個(gè)查詢(xún)集時(shí),使用的是緩存中的結(jié)果。
    9.2 限制查詢(xún)集
    可以對(duì)一個(gè)查詢(xún)集進(jìn)行取下標(biāo)或者切片操作來(lái)限制查詢(xún)集的結(jié)果。
    對(duì)一個(gè)查詢(xún)集進(jìn)行切片操作會(huì)產(chǎn)生一個(gè)新的查詢(xún)集,下標(biāo)不允許為負(fù)數(shù)。
    取出查詢(xún)集第一條數(shù)據(jù)的兩種方式:
    方式 說(shuō)明
    b[0] 如果b[0]不存在,會(huì)拋出IndexError異常
    b[0:1].get() 如果b[0:1].get()不存在,會(huì)拋出DoesNotExist異常。
    exists:判斷一個(gè)查詢(xún)集中是否有數(shù)據(jù)。True False
    10. 模型類(lèi)關(guān)系
    1) 一對(duì)多關(guān)系
    例:圖書(shū)類(lèi)-英雄類(lèi)
    models.ForeignKey() 定義在多的類(lèi)中。
    2) 多對(duì)多關(guān)系
    例:新聞?lì)?新聞?lì)愋皖?lèi) 體育新聞 國(guó)際新聞
    models.ManyToManyField() 定義在哪個(gè)類(lèi)中都可以。
    3) 一對(duì)一關(guān)系
    例:員工基本信息類(lèi)-員工詳細(xì)信息類(lèi). 員工工號(hào)
    models.OneToOneField定義在哪個(gè)類(lèi)中都可以。
    11. 關(guān)聯(lián)查詢(xún)(一對(duì)多)
    11.1 查詢(xún)和對(duì)象關(guān)聯(lián)的數(shù)據(jù)
    在一對(duì)多關(guān)系中,一對(duì)應(yīng)的類(lèi)我們把它叫做一類(lèi),多對(duì)應(yīng)的那個(gè)類(lèi)我們把它叫做多類(lèi),我們把多類(lèi)中定義的建立關(guān)聯(lián)的類(lèi)屬性叫做關(guān)聯(lián)屬性。
    例:查詢(xún)id為1的圖書(shū)關(guān)聯(lián)的英雄的信息。
    b=BookInfo.objects.get(id=1)
    b.heroinfo_set.all()
    通過(guò)模型類(lèi)查詢(xún):
    HeroInfo.objects.filter(hbook__id=1)
    例:查詢(xún)id為1的英雄關(guān)聯(lián)的圖書(shū)信息。
    h = HeroInfo.objects.get(id=1)
    h.hbook
    通過(guò)模型類(lèi)查詢(xún):
    BookInfo.objects.filter(heroinfo__id=1)
    格式:

    由一類(lèi)的對(duì)象查詢(xún)多類(lèi)的時(shí)候:
    一類(lèi)的對(duì)象.多類(lèi)名小寫(xiě)_set.all() #查詢(xún)所用數(shù)據(jù)
    由多類(lèi)的對(duì)象查詢(xún)一類(lèi)的時(shí)候:
    多類(lèi)的對(duì)象.關(guān)聯(lián)屬性 #查詢(xún)多類(lèi)的對(duì)象對(duì)應(yīng)的一類(lèi)的對(duì)象
    由多類(lèi)的對(duì)象查詢(xún)一類(lèi)對(duì)象的id時(shí)候:
    多類(lèi)的對(duì)象. 關(guān)聯(lián)屬性_id
    11.2 通過(guò)模型類(lèi)實(shí)現(xiàn)關(guān)聯(lián)查詢(xún)

    例:查詢(xún)圖書(shū)信息,要求圖書(shū)關(guān)聯(lián)的英雄的描述包含’八’。
    BookInfo.objects.filter(heroinfo__hcomment__contains=‘八’)
    例:查詢(xún)圖書(shū)信息,要求圖書(shū)中的英雄的id大于3.
    BookInfo.objects.filter(heroinfo__id__gt=3)
    例:查詢(xún)書(shū)名為“天龍八部”的所有英雄。
    HeroInfo.objects.filter(hbook__btitle=‘天龍八部’)
    通過(guò)多類(lèi)的條件查詢(xún)一類(lèi)的數(shù)據(jù):
    一類(lèi)名.objects.filter(多類(lèi)名小寫(xiě)__多類(lèi)屬性名__條件名)
    通過(guò)一類(lèi)的條件查詢(xún)多類(lèi)的數(shù)據(jù):
    多類(lèi)名.objects.filter(關(guān)聯(lián)屬性__一類(lèi)屬性名__條件名)
    12. 插入、更新和刪除
    調(diào)用一個(gè)模型類(lèi)對(duì)象的save方法的時(shí)候就可以實(shí)現(xiàn)對(duì)模型類(lèi)對(duì)應(yīng)數(shù)據(jù)表的插入和更新。
    調(diào)用一個(gè)模型類(lèi)對(duì)象的delete方法的時(shí)候就可以實(shí)現(xiàn)對(duì)模型類(lèi)對(duì)應(yīng)數(shù)據(jù)表數(shù)據(jù)的刪除。
    13. 自關(guān)聯(lián)

    自關(guān)聯(lián)是一種特殊的一對(duì)多的關(guān)系。
    案例:顯示廣州市的上級(jí)地區(qū)和下級(jí)地區(qū)。
    地區(qū)表:id, atitle, aParent_id;
    mysql終端中批量執(zhí)行sql語(yǔ)句:source areas.sql;
    14. 管理器
    BookInfo.objects.all()->objects是一個(gè)什么東西呢?
    答:objects是Django幫我自動(dòng)生成的管理器對(duì)象,通過(guò)這個(gè)管理器可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的查詢(xún)。
    objects是models.Manger類(lèi)的一個(gè)對(duì)象。自定義管理器之后Django不再幫我們生成默認(rèn)的objects管理器。
    14.1 自定義模型管理器類(lèi)

  • 自定義一個(gè)管理器類(lèi),這個(gè)類(lèi)繼承models.Manger類(lèi)。
  • 再在具體的模型類(lèi)里定義一個(gè)自定義管理器類(lèi)的對(duì)象。
    14.2 自定義管理器類(lèi)的應(yīng)用場(chǎng)景
    1) 改變查詢(xún)的結(jié)果集。
    比如調(diào)用BookInfo.books.all()返回的是沒(méi)有刪除的圖書(shū)的數(shù)據(jù)。
    2) 添加額外的方法。
    管理器類(lèi)中定義一個(gè)方法幫我們操作模型類(lèi)對(duì)應(yīng)的數(shù)據(jù)表。
    使用self.model()就可以創(chuàng)建一個(gè)跟自定義管理器對(duì)應(yīng)的模型類(lèi)對(duì)象。
    小結(jié):
  • 元選項(xiàng)
    Django默認(rèn)生成的表名:
    應(yīng)用名小寫(xiě)_模型類(lèi)名小寫(xiě)。
    元選項(xiàng):
    需要在模型類(lèi)中定義一個(gè)元類(lèi)Meta,在里面定義一個(gè)類(lèi)屬性db_table就可以指定表名。
  • 視圖

  • 視圖的功能
    接收請(qǐng)求,進(jìn)行處理,與M和T進(jìn)行交互,返回應(yīng)答。
    返回html內(nèi)容 HttpResponse,也可能重定向 redirect,還可以返回json數(shù)據(jù)。
  • 視圖函數(shù)使用
    2.1 使用
  • 定義視圖函數(shù)
    request參數(shù)必須有。是一個(gè)HttpRequest類(lèi)型的對(duì)象。參數(shù)名可以變化,
    但不要更改。
  • 配置url
    建立url和視圖函數(shù)之間的對(duì)應(yīng)關(guān)系。
    2.2 url配置的過(guò)程
  • 在項(xiàng)目的urls文件中包含具體應(yīng)用的urls文件,在具體應(yīng)用的urls文件中包含具體url和視圖的對(duì)應(yīng)關(guān)系。
  • url配置項(xiàng)是定義在一個(gè)名叫urlpatterns的列表中,其中的每一個(gè)元素就是一個(gè)配置項(xiàng),每一個(gè)配置項(xiàng)都調(diào)用url函數(shù)。
  • url匹配的過(guò)程
  • url:http://127.0.0.1:8000/aindex?a=1

  • 去除域名和后面的參數(shù),剩下/aindex,再把前面的/去掉,剩下aindex
  • 拿aindex先到項(xiàng)目的url.py文件中進(jìn)行從上到下的匹配,匹配成功之后執(zhí)行后面對(duì)應(yīng)的處理動(dòng)作,就是把匹配成功的部分a字符去除,然后拿剩下的部分index到應(yīng)用的urls.py文件中再進(jìn)行從上到下的匹配。
  • 如果匹配成功則調(diào)用相應(yīng)的視圖產(chǎn)生內(nèi)容返回給客戶端。如果匹配失敗則產(chǎn)生404錯(cuò)誤。
  • 錯(cuò)誤視圖
    404:找不到頁(yè)面,關(guān)閉調(diào)試模式之后,默認(rèn)會(huì)顯示一個(gè)標(biāo)準(zhǔn)的錯(cuò)誤頁(yè)面,如果要顯示自定義的頁(yè)面,則需要的templates目錄下面自定義一個(gè)404.html文件。
    a) url沒(méi)有配置
    b) url配置錯(cuò)誤
    500: 服務(wù)器端的錯(cuò)誤。
    a) 視圖出錯(cuò)
    網(wǎng)站開(kāi)發(fā)完成需要關(guān)閉調(diào)試模式,在settings.py文件中:
    DEBUG=False
    ALLOWED_HOST=[ ‘*’]
  • 捕獲url參數(shù)
    進(jìn)行url匹配時(shí),把所需要的捕獲的部分設(shè)置成一個(gè)正則表達(dá)式組,這樣django框架就會(huì)自動(dòng)把匹配成功后相應(yīng)組的內(nèi)容作為參數(shù)傳遞給視圖函數(shù)。
  • 位置參數(shù)
    位置參數(shù),參數(shù)名可以隨意指定
  • 關(guān)鍵字參數(shù):在位置參數(shù)的基礎(chǔ)上給正則表達(dá)式組命名即可。
    ?P<組名>
    關(guān)鍵字參數(shù),視圖中參數(shù)名必須和正則表達(dá)式組名一致.
  • 普通登錄案例
  • 顯示出登錄頁(yè)面
    a) 設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/login 時(shí)顯示登錄頁(yè)面。
    b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)login。
    c) 編寫(xiě)模板文件login.html。
    url 視圖 模板文件
    /login login login.html
  • 登錄校驗(yàn)功能
    a) 設(shè)計(jì)url,點(diǎn)擊登錄頁(yè)的登錄按鈕發(fā)起請(qǐng)求http://127.0.0.1:8000/login_check時(shí)進(jìn)行登錄校驗(yàn)。
    b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)login_check。
    接收表單提交過(guò)來(lái)的數(shù)據(jù)。
    進(jìn)行登錄校驗(yàn),若用戶名密碼正確則跳轉(zhuǎn)到登錄成功頁(yè)。若失敗在跳轉(zhuǎn)到登錄頁(yè)面。
    c) 登錄成功后跳轉(zhuǎn)到首頁(yè)。
    url 視圖 模板文件
    /login_check login_check 無(wú)
  • Ajax
    7.1 基本概念
    異步的javascript。在不全部加載某一個(gè)頁(yè)面部的情況下,對(duì)頁(yè)面進(jìn)行局的刷新,ajax請(qǐng)求都在后臺(tái)。
    圖片,css文件,js文件都是靜態(tài)文件。
  • 發(fā)起ajax請(qǐng)求:jquery發(fā)起
  • 執(zhí)行相應(yīng)的視圖函數(shù),返回json內(nèi)容
  • 執(zhí)行相應(yīng)的回調(diào)函數(shù)。通過(guò)判斷json內(nèi)容,進(jìn)行相應(yīng)處理。
    7.2 Ajax登錄案例
  • 首先分析出請(qǐng)求地址時(shí)需要攜帶的參數(shù)。
  • 視圖函數(shù)處理完成之后,所返回的json的格式。
  • 顯示出登錄頁(yè)面
    a) 設(shè)計(jì)url,通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/login_ajax 時(shí)顯示登錄頁(yè)面。
    b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)login_ajax。
    c) 編寫(xiě)模板文件login_ajax.html。
    在里面寫(xiě)jquery代碼發(fā)起ajax請(qǐng)求。
  • 登錄校驗(yàn)功能
    a) 設(shè)計(jì)url,點(diǎn)擊登錄頁(yè)的登錄按鈕發(fā)起請(qǐng)求http://127.0.0.1:8000/login_ajax_check時(shí)進(jìn)行登錄校驗(yàn)。
    b) 設(shè)計(jì)url對(duì)應(yīng)的視圖函數(shù)login_ajax_check。
    接收post提交過(guò)來(lái)的數(shù)據(jù)。
    進(jìn)行登錄校驗(yàn),并返回json內(nèi)容。 JsonRepsone
    Json格式如下:
    {‘res’:‘1’} #表示登錄成功
    {‘res’:‘0’} #表示登錄失敗
  • 狀態(tài)保持
    http協(xié)議是無(wú)狀態(tài)的。下一次去訪問(wèn)一個(gè)頁(yè)面時(shí)并不知道上一次對(duì)這個(gè)頁(yè)面做了什么。
    8.1 Cookie
  • cookie是由服務(wù)器生成,存儲(chǔ)在瀏覽器端的一小段文本信息。
    cookie的特點(diǎn):

  • 以鍵值對(duì)方式進(jìn)行存儲(chǔ)。
  • 通過(guò)瀏覽器訪問(wèn)一個(gè)網(wǎng)站時(shí),會(huì)將瀏覽器存儲(chǔ)的跟網(wǎng)站相關(guān)的所有cookie信息發(fā)送給該網(wǎng)站的服務(wù)器。request.COOKIES
  • cookie是基于域名安全的。www.baidu.com www.tudou.com
  • cookie是有過(guò)期時(shí)間的,如果不指定,默認(rèn)關(guān)閉瀏覽器之后cookie就會(huì)過(guò)期。
    記住用戶名案例。
    8.2 Session
  • session存儲(chǔ)在服務(wù)器端。
    session的特點(diǎn):

  • session是以鍵值對(duì)進(jìn)行存儲(chǔ)的。
  • session依賴(lài)于cookie。唯一的標(biāo)識(shí)碼保存在sessionid cookie中。
  • session也是有過(guò)期時(shí)間,如果不指定,默認(rèn)兩周就會(huì)過(guò)期。
    記住用戶登錄狀態(tài)案例。
    8.3 cookie和session的應(yīng)用場(chǎng)景
    cookie:記住用戶名。安全性要求不高。
    session:涉及到安全性要求比較高的數(shù)據(jù)。銀行卡賬戶,密碼
    模板
  • 模板的功能
    產(chǎn)生html,控制頁(yè)面上展示的內(nèi)容。模板文件不僅僅是一個(gè)html文件。
    模板文件包含兩部分內(nèi)容:
  • 靜態(tài)內(nèi)容:css,js,html。
  • 動(dòng)態(tài)內(nèi)容:用于動(dòng)態(tài)去產(chǎn)生一些網(wǎng)頁(yè)內(nèi)容。通過(guò)模板語(yǔ)言來(lái)產(chǎn)生。
  • 模板文件的使用
    通常是在視圖函數(shù)中使用模板產(chǎn)生html內(nèi)容返回給客戶端。
    a) 加載模板文件 loader.get_template
    獲取模板文件的內(nèi)容,產(chǎn)生一個(gè)模板對(duì)象。
    b) 定義模板上下文 RequeseContext
    給模板文件傳遞數(shù)據(jù)。
    c) 模板渲染產(chǎn)生html頁(yè)面內(nèi)容 render
    用傳遞的數(shù)據(jù)替換相應(yīng)的變量,產(chǎn)生一個(gè)替換后的標(biāo)準(zhǔn)的html內(nèi)容。
  • 模板文件加載順序
  • 首先去配置的模板目錄下面去找模板文件。
  • 去INSTALLED_APPS下面的每個(gè)應(yīng)用的templates去找模板文件,前提是應(yīng)用中必須有templates文件夾。
  • 模板語(yǔ)言
    模板語(yǔ)言簡(jiǎn)稱(chēng)為DTL。(Django Template Language)
    4.1 模板變量
    模板變量名是由數(shù)字,字母,下劃線和點(diǎn)組成的,不能以下劃線開(kāi)頭。
    使用模板變量:{{模板變量名}}
    模板變量的解析順序:
    例如:{{ book.btitle }}
  • 首先把book當(dāng)成一個(gè)字典,把btitle當(dāng)成鍵名,進(jìn)行取值book[‘btitle’]
  • 把book當(dāng)成一個(gè)對(duì)象,把btitle當(dāng)成屬性,進(jìn)行取值book.btitle
  • 把book當(dāng)成一個(gè)對(duì)象,把btitle當(dāng)成對(duì)象的方法,進(jìn)行取值book.btitle
    例如:{{book.0}}
  • 首先把book當(dāng)成一個(gè)字典,把0當(dāng)成鍵名,進(jìn)行取值book[0]
  • 把book當(dāng)成一個(gè)列表,把0當(dāng)成下標(biāo),進(jìn)行取值book[0]
    如果解析失敗,則產(chǎn)生內(nèi)容時(shí)用空字符串填充模板變量。
    使用模板變量時(shí),.前面的可能是一個(gè)字典,可能是一個(gè)對(duì)象,還可能是一個(gè)列表。
    4.2 模板標(biāo)簽
    {% 代碼段 %}
    for循環(huán):
    {% for x in 列表 %}

    列表不為空時(shí)執(zhí)行

    {% empty %}

    列表為空時(shí)執(zhí)行

    {% endfor %}
    可以通過(guò){{ forloop.counter }}得到for循環(huán)遍歷到了第幾次。
    {% if 條件 %}
    {% elif 條件 %}
    {% else %}
    {% endif %}
    關(guān)系比較操作符:> < >= <= == !=
    注意:進(jìn)行比較操作時(shí),比較操作符兩邊必須有空格。
    邏輯運(yùn)算:not and or
    4.3 過(guò)濾器
    過(guò)濾器用于對(duì)模板變量進(jìn)行操作。
    date:改變?nèi)掌诘娘@示格式。
    length:求長(zhǎng)度。字符串,列表.
    default:設(shè)置模板變量的默認(rèn)值。
    格式:模板變量|過(guò)濾器:參數(shù)
    自定義過(guò)濾器。
    自定義的過(guò)濾器函數(shù),至少有一個(gè)參數(shù),最多兩個(gè)
    參考資料:(模板標(biāo)簽和內(nèi)置過(guò)濾器)
    http://python.usyiyi.cn/documents/django_182/ref/templates/builtins.html
    4.4 模板注釋
    單行注釋:{# 注釋內(nèi)容 #}
    多行注釋:{% comment %}
    注釋內(nèi)容
    {% endcomment %}
  • 模板繼承
    模板繼承也是為了重用html頁(yè)面內(nèi)容。
  • 在父模板里可以定義塊,使用標(biāo)簽:
    {% block 塊名 %}
    塊中間可以寫(xiě)內(nèi)容,也可以不寫(xiě)
    {% endblock 塊名%}
    子模板去繼承父模板之后,可以重寫(xiě)父模板中的某一塊的內(nèi)容。
    繼承格式:{% extends 父模板文件路徑%}
    {% block 塊名 %}
    {{ block.super}} #獲取父模板中塊的默認(rèn)內(nèi)容
    重寫(xiě)的內(nèi)容
    {% endblock 塊名%}
    6. html轉(zhuǎn)義
    編輯商品詳情信息,數(shù)據(jù)表中保存的是html內(nèi)容。
    在模板上下文中的html標(biāo)記默認(rèn)是會(huì)被轉(zhuǎn)義的。
    小于號(hào)< 轉(zhuǎn)換為<
    大于號(hào)> 轉(zhuǎn)換為>
    單引號(hào)’ 轉(zhuǎn)換為’
    雙引號(hào)" 轉(zhuǎn)換為 "
    與符號(hào)& 轉(zhuǎn)換為 &
    要關(guān)閉模板上下文字符串的轉(zhuǎn)義:可以使用 {{ 模板變量|safe}}
    也可以使用:
    {% autoescape off %}
    模板語(yǔ)言代碼
    {% endautoescape %}
    模板硬編碼中的字符串默認(rèn)不會(huì)經(jīng)過(guò)轉(zhuǎn)義,如果需要轉(zhuǎn)義,那需要手動(dòng)進(jìn)行轉(zhuǎn)義。
    7. csrf攻擊
    首先做一個(gè)登錄頁(yè),讓用戶輸入用戶名和密碼進(jìn)行登錄,登錄成功之后跳轉(zhuǎn)的修改密碼頁(yè)面。在修改密碼頁(yè)面輸入新密碼,點(diǎn)擊確認(rèn)按鈕完成密碼修改。
    登錄頁(yè)需要一個(gè)模板文件login.html.修改密碼頁(yè)面也需要一個(gè)模板文件change_pwd.html.
    顯示登錄頁(yè)的視圖login,驗(yàn)證登錄的視圖login_check,顯示發(fā)帖頁(yè)的視圖change_pwd,處理修改密碼的視圖change_pwd_action.
    加功能:
    a)只有用戶登錄之后才可以進(jìn)行修改密碼操作。
    登錄裝飾器函數(shù)。

    案例流程圖:

    django防止csrf的方式:

  • 默認(rèn)打開(kāi)csrf中間件。
  • 表單post提交數(shù)據(jù)時(shí)加上{% csrf_token %}標(biāo)簽。
    防御原理:
  • 渲染模板文件時(shí)在頁(yè)面生成一個(gè)名字叫做csrfmiddlewaretoken的隱藏域。
  • 服務(wù)器交給瀏覽器保存一個(gè)名字為csrftoken的cookie信息。
  • 提交表單時(shí),兩個(gè)值都會(huì)發(fā)給服務(wù)器,服務(wù)器進(jìn)行比對(duì),如果一樣,則csrf驗(yàn)證通過(guò),否則失敗。
  • 驗(yàn)證碼
    在用戶注冊(cè)、登錄頁(yè)面,為了防止暴力請(qǐng)求,可以加入驗(yàn)證碼功能,如果驗(yàn)證碼錯(cuò)誤,則不需要繼續(xù)處理,可以減輕業(yè)務(wù)服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器的壓力。
  • 反向解析
    當(dāng)某一個(gè)url配置的地址發(fā)生變化時(shí),頁(yè)面上使用反向解析生成地址的位置不需要發(fā)生變化。
    根據(jù)url 正則表達(dá)式的配置動(dòng)態(tài)的生成url。
    在項(xiàng)目urls中包含具體應(yīng)用的urls文件時(shí)指定namespace;
  • 在應(yīng)用的urls中配置是指定name;

    在模板文件中使用時(shí),格式如下:
    {% url ‘namespace名字:name’ %} 例如{% url ‘booktest:fan2’%}
    帶位置參數(shù):
    {% url ‘namespace名字:name’ 參數(shù) %} 例如{% url ‘booktest:fan2’ 1%}
    帶關(guān)鍵字參數(shù):
    {% url ‘namespace名字:name’ 關(guān)鍵字參數(shù) %} 例如{% url ‘booktest:fan2’ id=1 %}
    在重定向的時(shí)候使用反向解析:
    from django.core.urlresolvers import reverse
    無(wú)參數(shù):
    reverse(‘namespace名字:name名字’)
    如果有位置參數(shù)
    reverse(‘namespace名字:name名字’, args = 位置參數(shù)元組)
    如果有關(guān)鍵字參數(shù)
    reverse(‘namespace名字:name名字’, kwargs=字典)
    其他技術(shù)

  • 靜態(tài)文件
    1.1 使用
    在 網(wǎng)頁(yè)使用的css文件,js文件和圖片叫做靜態(tài)文件。
  • 新建靜態(tài)文件夾 static。

  • 配置靜態(tài)文件所在的物理目錄。Settings.py

  • STATIC_URL設(shè)置訪問(wèn)靜態(tài)文件對(duì)應(yīng)的url。
    STATICFILES_DIRS設(shè)置靜態(tài)文件所在的物理目錄。
    動(dòng)態(tài)生成靜態(tài)文件的路徑。
    1.2 加載目錄
    STATICFILES_FINDERS=(‘django.contrib.staticfiles.finders.FileSystemFinder’, ‘django.contrib.staticfiles.finders.AppDirectoriesFinder’)
    2. 中間件
    中間件函數(shù)是django框架給我們預(yù)留的函數(shù)接口,讓我們可以干預(yù)請(qǐng)求和應(yīng)答的過(guò)程。

    2.1 獲取瀏覽器端的ip地址
    使用request對(duì)象的META屬性:request.META[‘REMOTE_ADDR’]
    2.2 使用中間件

  • 新建middleware.py文件。

  • 定義中間件類(lèi)。

  • 在類(lèi)中定義中間件預(yù)留函數(shù)。
    init:服務(wù)器響應(yīng)第一個(gè)請(qǐng)求的時(shí)候調(diào)用。
    process_request:是在產(chǎn)生request對(duì)象,進(jìn)行url匹配之前調(diào)用。
    process_view:是url匹配之后,調(diào)用視圖函數(shù)之前。
    process_response:視圖函數(shù)調(diào)用之后,內(nèi)容返回給瀏覽器之前。
    process_exception:視圖函數(shù)出現(xiàn)異常,會(huì)調(diào)用這個(gè)函數(shù)。
    如果注冊(cè)的多個(gè)中間件類(lèi)中包含process_exception函數(shù)的時(shí)候,調(diào)用的順序跟注冊(cè)的順序是相反的。
    3) 注冊(cè)中間件類(lèi)。

  • Admin后臺(tái)管理
    3.1 使用
  • 本地化。語(yǔ)言和時(shí)區(qū)本地化。
  • 創(chuàng)建超級(jí)管理員。
    python mange.py createsuperuser
  • 注冊(cè)模型類(lèi)。
  • 自定義管理頁(yè)面。
    自定義模型管理類(lèi)。
    注冊(cè)模型類(lèi)的時(shí)候給register函數(shù)添加第二個(gè)參數(shù),就是自定義模型管理類(lèi)的名字。
    3.2 模型管理類(lèi)相關(guān)屬性
  • 列表頁(yè)相關(guān)的選項(xiàng)。
  • 編輯頁(yè)相關(guān)的選項(xiàng)。
  • 上傳圖片
    商品銷(xiāo)售網(wǎng)站。
    4.1 配置上傳文件保存目錄
  • 新建上傳文件保存目錄。

  • 配置上傳文件保存目錄。

  • 4.2 后臺(tái)管理頁(yè)面上傳圖片

  • 設(shè)計(jì)模型類(lèi)。

  • 遷移生成表格。

  • 注冊(cè)模型類(lèi)。
    4.3 用戶自定義頁(yè)面上傳圖片

  • 定義用戶上傳圖片的頁(yè)面并顯示,是一個(gè)自定義的表單。

  • 定義接收上傳文件的視圖函數(shù)。
    request對(duì)象有一個(gè)FILES的屬性,類(lèi)似于字典,通過(guò)request.FILES可以獲取上傳文件的處理對(duì)象。
    在django中,上傳文件不大于2.5M,文件放在內(nèi)存中。上傳文件大于2.5M,文件內(nèi)容寫(xiě)到一個(gè)臨時(shí)文件中。
    Django處理上傳文件的兩個(gè)類(lèi):
    FILE_UPLOAD_HANDLERS= (“django.core.files.uploadhandler.MemoryFileUploadHandler”,
    “django.core.files.uploadhandler.TemporaryFileUploadHandler”)
    上傳圖片參考資料:

  • http://python.usyiyi.cn/documents/django_182/topics/http/file-uploads.html
  • http://python.usyiyi.cn/documents/django_182/ref/files/uploads.html#django.core.files.uploadedfile.UploadedFile
  • 分頁(yè)
    查詢(xún)出所有省級(jí)地區(qū)的信息,顯示在頁(yè)面上。
    AeroInfo.objects.filter(aParent__isnull = True)
  • 查詢(xún)出所有省級(jí)地區(qū)的信息。
  • 按每頁(yè)顯示10條信息進(jìn)行分頁(yè),默認(rèn)顯示第一頁(yè)的信息,下面并顯示出頁(yè)碼。
  • 點(diǎn)擊i頁(yè)鏈接的時(shí)候,就顯示第i頁(yè)的省級(jí)地區(qū)信息。
    from django.core.paginator import Paginator
    paginator = Paginator(areas, 10) #按每頁(yè)10條數(shù)據(jù)進(jìn)行分頁(yè)
    Paginator類(lèi)對(duì)象的屬性:
    屬性名 說(shuō)明
    num_pages 返回分頁(yè)之后的總頁(yè)數(shù)
    page_range 返回分頁(yè)后頁(yè)碼的列表
    Paginator類(lèi)對(duì)象的方法:
    方法名 說(shuō)明
    page(self, number) 返回第number頁(yè)的Page類(lèi)實(shí)例對(duì)象
  • Page類(lèi)對(duì)象的屬性:
    屬性名 說(shuō)明
    number 返回當(dāng)前頁(yè)的頁(yè)碼
    object_list 返回包含當(dāng)前頁(yè)的數(shù)據(jù)的查詢(xún)集
    paginator 返回對(duì)應(yīng)的Paginator類(lèi)對(duì)象

    Page類(lèi)對(duì)象的方法:
    屬性名 說(shuō)明
    has_previous 判斷當(dāng)前頁(yè)是否有前一頁(yè)
    has_next 判斷當(dāng)前頁(yè)是否有下一頁(yè)
    previous_page_number 返回前一頁(yè)的頁(yè)碼
    next_page_number 返回下一頁(yè)的頁(yè)碼
    分頁(yè)參考資料:
    http://python.usyiyi.cn/translate/django_182/topics/pagination.html
    6. 省市縣選擇案例

  • 顯示省地區(qū)信息。
    $.get(’/prov’, function(data){
    })
  • 省改變時(shí)在對(duì)應(yīng)的下拉列表框中顯示下級(jí)市的信息。
    $.get(’/city?pid=’+pid, function(data){
    })
    request.GET.get(‘pid’)
    或者:
    .get(′/city′+.get('/city'+.get(/city+(this).val(), function(data){
    })
  • 市改變時(shí)在對(duì)應(yīng)的下拉列表框中顯示下級(jí)縣的信息。
    $.get(’/dis?pid=’+pid, function(data){
    })
    或者:
    .get(′/dis′+.get('/dis'+.get(/dis+(this).val(), function(data){
    })
  • 總結(jié)

    以上是生活随笔為你收集整理的Django详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。