web框架-Django

Django簡介css

 

  • pip安裝,配置環境變量 ……python\script                     django-admin

建立、操做django項目:html

  • 建立工程項目
    • 方式一:cmd命令行     django-admin startproject 項目名
    • 方式二:IDE,pycharm中建立django項目
      • 在使用pycharm過程當中,須要設置django server:
        • 名字是項目名字
        • 默認ip,端口
        • environment variable:      DJANGO_SETTINGS_MODULE 工程項目名.settings               PYTHONUNBUFFERED : 1
        • python解釋器
    • 運行:
      • 命令行中,  python    manage.py runserver  指定host:端口        host和端口可省略,使用默認
      • pycharm中完成配置。   在「select run /debug configuration」 中選定配置好的django ,點擊運行   
  • django項目目錄結構:
    • 與項目同名的文件夾     :完成程序的總體配置
    • init
    • settings                    :配置文件
      • TEMPLATES  進行模板文件配置,設置模板文件的查找路徑等。
      • STATIC_DIR    靜態路徑
      • STATICFILES_DIRS  靜態文件路徑配置,設置css,js等靜態文件路徑信息
    • urls                      :url對應關係
    • wsji            :wsgi規範
    • manage.py     :管理django程序
      • python manage.py 運行
      • python manage.py startapp  程序名
      • python manage.py  makemigrations
      • python manage.py migrate  
  •  建立app
    • 在cmd命令行中,進入工程項目目錄,  python manage.py startapp  指定app名
    • windows python中可經過 Teminal 運行上面的命令
    • 常見app   :cmdb  templates  openstack……
    • app內部結構文件功能(cmdb):
      • migrations: 數據修改表結構
        • 內部有django自動建立的數據庫修改表結構的操做記錄,注意,僅記錄了對錶結構的修改,數據庫中的記錄的操做,不記錄。
      • __init__      把文件夾轉成包
      • admin    django爲咱們提供的後臺管理
        • 包括了登陸、添加、刪除、權限管理等基本功能。
      • apps    配置當前app
      • models:  ORM,寫入指定的類,經過命令建立和修改數據庫結構
      • tests:     單元測試
      • views:    和cmdb相關的全部業務,業務邏輯代碼
    • 不一樣文件、模塊間的調用過程當中,注意覈實settings中環境的配置
    • 配置模板的路徑
      • 在settings中,DIRS:[os.path.join(BASE_DIR,"模板包名字")] 通常的是templates
    • 配置靜態文件的路徑
      • 在settings中,STATIC_DIR後面,加上STATICFILES_DIRS = (os.path.join(BASE_DIR,"靜態文件名字"),)  通常地靜態文件名爲static
  •  django項目建立步驟
    • 1 建立django工程     django-admin startproject 工程項目名
    • 2 建立app   cd工程文件夾  python manage.py startapp  app名
    • 3 靜態文件配置
      • 靜態網頁,靜態網頁是相對於動態網頁而言,是指沒有後臺數據庫、不含程序和不可交互的網頁。
        • 靜態網頁優點:能夠公開(即副本能夠證實給任何人)。託管沒得任何特殊的要求。(不須要特殊的中間軟件好比超文本預處理器、公共網關接口)沒得網絡服務器或應用服務器,好比直接從CD-ROM(激光唱片-只讀存儲器)或USB閃存驅動器讀取內容,能夠經過網絡瀏覽器直接訪問。網站更安全,HTML頁面不會受Asp相關漏洞的影響;並且能夠減小攻擊,防SQL注入。數據庫出錯時,不影響網站正常訪問。不須要編譯,因此速度快,節省服務器資源。網址格式友好,搜索引擎容易識別。內容是固定的,交互性差,內容更新維護複雜。沒有自動化的工具,維護大量的靜態頁面文件是不現實的。沒法充分支持用戶/客戶的需求(外觀選擇,瀏覽器的支持,Cookie)。
      • 靜態文件,通常是指css,js,img等相似的,讓html直接引用的,能夠直接暴露給用戶的文件即歸爲靜態文件.
      • 靜態文件配置方式:
        • 方式一:
          • 在settings文件下,配置文件中已經有了靜態文件的別名,STATIC_URL='/static/'   在這以後添加  STATICFILES_DIRS=[os.path.join(BASE_DIR,'    ')]   .使用的時候,用別名static.
    • 4 模板配置
    • 5 csrf
    • 6 定義路由規則    urls.py       請求字段——》響應函數名(視圖函數、)
      • urlpatterns=[ ]  
    • 7 定義視圖函數   app 下 views   判斷數據發送方式,經過request拿數據,數據處理,數據返回
      •   HttpResponse-傳字符串、               HttpResposnse(" 字符串 ")
      •   render-傳HTML模板路徑、               render(request ,"abc.html",{ 替換形式字典 })
      •   redirect-傳       /URL)                       redirect(' /abc/ddd ')

django請求前端

    • 請求                             通常狀況下,GET方式用來獲取數據,POST用於提交數據。其餘的提交方式還有PUT/DELET等
    • 路由關係映射
    • 視圖函數
    • 數據       html模板
    • 渲染之後返回給用戶

 

路由系統(urls)python

    • 常見的url匹配規則:
      • 1  一 一對應靜態匹配,url('index/',views.index)           url('home/',views.Home.as_view())   在設置路由關係時字段內容最後要加上$終止符,不然在匹配過程當中,會因爲不是截止的精確匹配,於是先後優先級致使匹配錯亂。     例如,url('index/$',views.index)
      • 2 利用正則實現動態匹配(相似傳遞位置參數)   url(r'detail-(\d+).html',views.detail)
        • 正則當中使用分組的狀況下,會有二次匹配的狀況,傳遞的參數會將全部的結果都傳到視圖函數中.
      • 3   利用正則表達式的分組實現(在函數調用時,參數以關鍵字形式傳遞)               url(r「detail-(?p<nid>\d+)-(?p<uid>\d+).html」,views.detail)此url路由匹配規則在傳遞獲取的參數時,會以nid=***,uid=***進行傳遞     爲了方便,在views定義視圖函數的時候,直接用不定長參數*args,**kwargs定義。
      • 注意
        • 要想從路徑中捕獲某些信息,只須要在對應的正則內容上面加分組,進行二次匹配
        • 使用正則的時候,前面開始的反斜槓不用加,會自動添加
        • 正則表達式前面的r雖然是可選項,但通常狀況下最好是加上.
        • 因爲路由系統的匹配順序是自上而下的順序匹配,因此,在正常的匹配規則最後,最好是加上 ‘$’ 終止符,作精準匹配,防止出現上面的url匹配規則把某類的匹配所有截獲,下面的匹配規則得不到有效執行。
    • 獲取當前url信息,request.path_info
    • 路由分發,主要的目的是實現不一樣app之間進行解耦.當請求到頂級(項目同名)url的時候,經過include,根據請求的關鍵字,對請求進行一個分發,同時在不一樣的app中創建局部的urls文件,避免不一樣app之間urls放在一塊兒,加強系統的易讀易維護性。              頂級url負責分發,  例如, url("monitor/",include("app003.urls")),url("cmdb/",include("app06.urls"))
      • 首先 from urls import include
      • 前面的匹配規則能夠用正則,也能夠爲空,當爲空的時候,會直接到各個app中進行進一步匹配.
    • 路由的反向解析
      • 目的是不在代碼中把url寫死,而是經過反向查詢動態獲取。 
      • 主要應用方式:
        • 在模板中,利用{%url     '路由中給匹配規則起得別名' %}
        • 在視圖函數中,reverse的應用,利用reverse函數,能夠根據路由名稱(別名),返回具體的路徑。注意當路由中有正則表達式時,須要把代替填充的內容一併傳遞過去。
    • url默認值,在路由系統中,能夠給視圖函數傳遞默認值,此時,須要保證視圖函數有對應的形參用於接收默認值。     例如     url("index/",views.index,{"name":"root"}) ,這時候,index視圖函數的name參數會接收路由調用時自動傳遞過來的默認值root。 
    • url命名空間。使用反向解析的時候,在路由分發的狀況中,若是出現不一樣的url指向相同函數而且url所定義的別名相同等狀況(例如不一樣app定義的url匹配規則,雖然在不一樣的app中,但定義別名一致時命名相同),單純使用url的name沒有辦法獲得確切的url路徑,這時須要同時利用url的name,和定義路由時所一併定義命名空間。 定義命名空間的基本語法     url(「a/」,include("app01.urls",namespace="a1")) url(「b/」,include("app01.urls",namespace="b1"))    經過reverse( ‘ 命名空間namespace:路由name ’ )   能夠肯定url路徑
    • url,  re_path,  path
      • re_path實際上就是以前的版本中的url方法,通常是結合正則表達式使用
      • 通常狀況下,使用url、repath進行匹配後,若是規則中有正則而且分組的話,匹配出來的分組內容其實是以字符串形式,傳遞給視圖函數的。另外,若是正則表達式中出現有名分組,須要對捕獲到的內容進行類型強轉。上述狀況在django2.0以上的版本適合用path方法
      • path方法,與轉化器
        • 轉化器基本使用語法       path(' 包含轉換器的url規則 ',視圖函數,別名)           注意轉換器是用尖括號包裹的<匹配轉換器類型:分組名稱>,一樣的,url規則不須要前導斜槓。 
        • 當前內置的轉換器,有int,str,uuid, slug,  path
        • 自定義轉化器
          1. 定義轉換器類
            • regex 類屬性,字符串類型
            • to_python(self, value) 方法,value是由類屬性 regex 所匹配到的字符串,返回具體的Python變量值,以供Django傳遞到對應的視圖函數中。
            • to_url(self, value) 方法,和 to_python 相反,value是一個具體的Python變量值,返回其字符串,一般用於url反向引用。
            • 1 # 新建py文件
              2 class FourDigitYearConverter:  
              3     regex = '[0-9]{4}'  
              4     def to_python(self, value):  
              5         return int(value)  
              6     def to_url(self, value):  
              7         return '%04d' % value
              View Code

               

          2. 進行url配置註冊
            • 使用register_converter 將其註冊到URL配置中
            • 1 from django.urls import register_converter, path  
              2 from . import converters, views  
              3 register_converter(converters.FourDigitYearConverter, 'yyyy')  
              4 urlpatterns = [  
              5     path('articles/2003/', views.special_case_2003),  
              6     path('articles/<yyyy:year>/', views.year_archive),  
              7     ...  
              8 ]
              View Code

               

 

視圖函數 mysql

    • 本質上就是一個python函數,但必須有返回值,也就是必須有return,返回內容是按規定的格式。通常是存放在views.py文件中。
    • 視圖函數操做的對象,能夠簡單的分爲請求對象、響應對象兩部分,其中request就是請求對象,封裝了前端發過來的請求信息。響應對象有HTTPResponse、render方法本質上是對響應內容的封裝並以HTTPresponse對象形式返回、
    • 後臺數據獲取
      • request是前端數據的打包
      • 經常使用的request的屬性
        • request.body     用戶發起請求的請求體     
        • request.GET存儲get請求信息         request.POST存儲post請求信息        request.FILES    ……
        •  通常狀況下,GET方式用來獲取數據,POST用於提交數據。其餘的提交方式還有PUT/DELET等 
        • request.POST.get()
        • request.GET.get()
        • request.POST.getlist() 當提交的數據包含複選框等並列內容時,用getlist能夠統一接收。
        • request.FILES.get() 
          • 要上傳文件,須要在form標籤中,須要作設置,enctype='multipart/form-data'
          • 上傳文件時,FILES.get()獲取上傳的文件對象的屬性信息。
        • request.FILES.size()
        • request.FILES.chunks()
          • 分段獲取的,上傳的文件內容。須要讀取文件內容的話,須要對FILES.chunks()進行循環。
        • request.path_info     獲取當前url中的【路徑信息】
      • 經常使用的request的方法
        • request.Meta()
        • request.method() 
        • request.get_full_path() 得到當前url中的 【路徑信息】和【請求參數信息】
      • request中封裝了url請求的全部原生信息,其實是以類的形式存在的
        • 要查看請求體的詳細信息,須要導入WSGIRequest    ,  from django.core.handlers.wsgi import WSGIRequest
        • request.environ 能夠拿到請求體的完整信息,字典形式存放的
        • request.environ[ ] 能夠拿到指定的信息內容,   例如,request.environ['HTTP_USER_AGENT'] 
    • reverse函數,能夠根據路由的名稱,反向解析出完整的路由信息。
      • 導入,from django.urls import reverse
      • 對於未指明namespace的,    reverse(路由name);                對於指明namespace的,                   reverse(命名空間namespace:路由name)
    • 返回內容
      • 包含django的模板標籤的html文件,並不是真正的html文件(瀏覽器是不能對這種文件直接進行解析的),render方法是在傳輸響應信息前對模板文件進行了數據渲染,替換掉了模板標籤。
      • return HttpResponse()  返回簡單字符串                           return render(request,"    html文件",{  替換內容  })返回取到數據渲染後的html文件內容        return redirect( ' 重定向 url  ' )     
      • 數據返回的時候,cookie的設置內容是經過響應頭傳遞回去的
    • FBV(function base views)   與  CBV(class base views)
      • FBV 由url直接對應(映射)函數名,  CBV 由url直接對應(映射)到指定的類。
      • CBV 本質上,經過dispatch反射,實現根據數據請求的發送方式選擇不一樣方法執行
      • CBV方式,能夠經過重寫dispatch,實現自定製功能
    • 裝飾器(定義方式是同樣的,調用方式不一致)
      • 基於FBV的
        •  1 #---------基於FBV的裝飾器實現COOKIE登陸驗證-----------
           2 
           3 def auth(func):
           4     def inner(request,*args,**kwargs):
           5         v = request.COOKIES.get("user111")
           6         if not v:
           7             return redirect('/login/')
           8         return func(request,*args,**kwargs)
           9     return inner
          10 
          11 @auth
          12 def func01(request):
          13     return HttpResponse("hello world")
          View Code
      • 基於CBV的
        • 基於CBV的視圖函數,加裝飾器時,須要導入模塊  from django.utils.decorators import method_decorator      而後經過@method_decorator(auth)加裝飾器
        • 具體調用方式:
          • 方式一,能夠直接對類函數進行裝飾
          •  方式二:對類裏的方法全都裝飾的狀況下,能夠利用dispatch函數。重寫dispath函數,並加上裝飾器,用super(類,self).dispatch(request,*args,**kwargs)進行正常的方法執行,在此執行的先後,能夠自定義部分功能,實現裝飾器的功能。
          • 方式三:直接在類名上面加裝飾器,本質上,方式三是對方式二的簡化
            •  1 #---------基於CBV的裝飾器實現COOKIE登陸驗證-----------
               2 
               3 def auth(func):
               4     def inner(request,*args,**kwargs):
               5         v = request.COOKIES.get("user111")
               6         if not v:
               7             return redirect('/login/')
               8         return func(request,*args,**kwargs)
               9     return inner
              10 
              11 @method_decorator(auth,name="dispatch")                   #方式三
              12 class Order(views.View):
              13 
              14     @method_decorator(auth)                            #方式二
              15     def dispatch(self,request,*args,**kwargs):
              16         return super(Order,self).dispatch(request,*args,**kwargs)
              17 
              18     @method_decorator(auth)                             #方式一
              19     def func1(self,request):
              20         return HttpResponse("hello world普通函數")
              View Code

 

Templates 模板jquery

    • 模板基礎語法只有   {{   }}  和 {%     %} 兩種。前者是用於傳遞渲染變量用的,後者是用於渲染標籤的。
    • 能夠直接定義html,而後實如今視圖函數中進行調用
    • 變量的渲染與使用
      • 變量的渲染是經過  {{   }} 實現的。
      • 使用方式:
        • 模板中用 {{ }} 定義好變量的位置
        • 在視圖函數中,使用render方法進行變量傳遞,若是是傳遞單個變量,能夠直接以字典形式在render方法中用第三個參數傳遞過去,若是是變量比較多,便可以一個個的傳遞,也能夠經過locals()方法,把視圖函數中的變量打包成指定格式傳遞到模板中。
      • 深度查詢
        • 在傳遞的變量是列表、字典、對象等類型的數據時,直接在模板中用 「 。 」 對須要的內容進行深度查詢,從而拿到相應的內容。
      • 過濾器,即函數的使用
    • 標籤的渲染和使用
      • {%  %} 渲染控制語句,基本的邏輯控制語法以下:
        • for循環基本語法:
          • {%for   條件  %}   循環體        {% endfor %} 
          • {%for   條件  %}   循環體    {%empty%}當遍歷到的內容爲空時的執行語句    {% endfor %} 
          • {{forloop}}能夠拿到當前循環的次數,即循環的序列號。使用時直接 forloop.count,另外還有forloop.count0從0開始計數,forloop.revcounter ,forloop.revcounter0 ,forloop.last是否最後一個,forloop.first是否第一次循環。  當出現嵌套循環的時候, forloop.parentloop將每次循環過程當中,父循環的上述6個參數打包。
        • 條件語句基本語法
          • {%if     條件%}       函數體       {%else   條件 %}   函數體 
        • with as  當正常的變量名或深度查詢等特別長不方便使用的時候,建立簡寫
          • {%with 正常的變量或深度查詢等  as  簡寫內容%}  邏輯語句  {%endwith%}
      • 繼承、過濾器、csrf_token
    • 繼承,在佈局重複的狀況下,可使用html母版,經過繼承母版的設置,提升程序的可讀性、易維護性,下降維護成本
      • 使用方式:
        • 1 定義佈局母版html ,在母版中用{%block 模塊名字%}{%endblock%}定義能夠替換的模塊及其位置。
        • 2 在引用html文件中,聲明引用的母版      {%extends 「佈局母版html文件名字」% }
        • 3 定義好當前html文件用於替換佈局母版的內容。 {%block 模塊名字%}自定義的內容{%endblock%}
        • 4 在具體頁面中還有特有的css,js的狀況,在母版中留出自定製css,js的位置,通常能夠在模板的style位置後加入css的block,在js包括jquery位置加js的block,在具體頁面中用自定義替換便可
      • 使用繼承的注意事項:
        • extends標籤必須在引用文件的首行
        • 在帶引用的母版文件中,{%block 模塊名字%}{%endblock%}越多越好,能夠理解爲越多狀況下的可改造程度越高。
        • 通常狀況下,子版中寫入內容後,會直接把母版中的{%block 模塊名字%}默認內容{%endblock%},其中的默認內容直接用子版定義的內容替換掉。若是想在母版內容保留的前提下,添加內容,能夠在定義子版內容的時候,加一個{{ block.super }} 的標籤。
      • 一個html頁面,只能繼承一個母版。能夠理解爲電腦的主板,頁面的總體框架,能夠從母版中繼承過來。
    • 組件,對於頁面中的重複佈局,可使用組件,提升程序的可讀性、易維護性,下降維護成本
      • 1 定義組件html文件
      • 2 在具體html文件中,用include對組件進行引用       基本語法,{%include ' 引用組件的html文件名稱 '%}
      • 組件能夠理解爲電腦的,鼠標鍵盤等中可插拔設備。
    • 對於繼承的母版、頁面引用的組件,django會在進行渲染以前,先把這些內容都拿過來,生成一個完成的模板文件,而後再融入數據庫替換的數據,最後在進行渲染。  
    • 函數(過濾器)與標籤自定義,simple_tag
      • 1調用python內置函數(過濾器)
        • {{ 變量 | 內置函數:參數 }}  
        • 經常使用的內置函數(內置過濾器)
          • data      定製時間顯示格式
          • default     定製默認顯示內容,當沒有接收到變量的時候,若是沒有默認內容,變量的位置直接爲空
          • filesizeformat   格式化輸出文件大小
          • truncatechars    按字節進行內容截斷
          • truncatewords    按單詞截斷
          • safe 安全解析標誌,在正常狀況下,若是是傳遞包括<>的內容時,django會先經過html特殊符號對照表,對內容進行編譯再傳遞,目的是防止不安全代碼注入。
            • 經過safe過濾器,把傳遞的內容標註爲安全的,django會把這部份內容正常寫入html文件,交給客戶端瀏覽器解析。
          • add,
          • upper  
      • 2自定義函數(過濾器)或標籤
        • a. app下建立templatetags目錄
        • b. 建立py文件
        • c. 自定義標籤,導入模塊 from django import template    from django.utils.safestring import mark_safe  建立template對象,register  繼承自template.Library。名字必須是register不能用其餘的。
        • d.  建立自定義函數,加裝飾器  @register.simple_tag
        • e. settings中註冊當前app
        • f.在引用文件頂部導入函數文件  { % load 函數所在的py文件名 % },
        • g. 執行自定義函數  { % 函數名 參數1   參數2  …… % }   
        • 在建立函數上面的加的裝飾器,還能夠是@register.filter      此時,調用函數的時候格式相似調用python內置函數,{{參數|函數名:數字參數}}  當傳的參數較多時,用字符串,  {{參數 | 函數名:「參數二,參數三,」}}。這種方式的缺點是,參數數量有限制,函數名後最多放兩個參數,而且元素之間不能有空格。優勢是能做爲if判斷條件使用,放在 template  模板流程控制中
    • 當模板html文件中,既有extend繼承,又有load時,必須將load放在extend以後,主要緣由是extend繼承過來的是模板文件的總體框架。

 CSRF簡介及中間件設置介紹git

  • CSRF與跨站請求僞造簡介
    • csrf原理
    • 跨站請求僞造
    • 無csrf時存在的隱患(csrf存在的意義)
    • 通常狀況下,當request.mehtod是get,head,options,trace等方式的時候,能夠不加csrf_token
    • form表單提交與csrf,正常狀況下,直接用form發post請求,django會把請求攔截下來。
      • 在form表單代碼中,起始位置,添加標籤{%csrf_token%} 本質上,是在作渲染時,django把這個標籤渲染成了一個隱藏的input標籤。
      • 執行流程,是在第一次打開帶有form表單的頁面的時候發動的是get請求,視圖函數給的響應是返回登陸頁面,此時django會先拿到模板文件對內容渲染後傳遞到客戶端,再提交post請求的額時候,是帶着這個隱藏的input標籤進行提交的,這相似於拿着取到的門卡去提交。
    • csrf設置
      • 全局設置     settings中,找中間件      MIDLEWARE[  
        'django.middleware.csrf.CsrfViewMiddleware'
         ]
      • 局部設置     用裝飾器對視圖函數進行設置              單獨加加csrf設置 @csrf_protect         單獨取消csrf設置 @csrf_exempt
    • ajax提交與csrf
      • 單個ajax請求時,設置
      • 對頁面中全部ajax請求統一設置 

 

 

Models,數據庫操做(ORM) web

    • 主流ORM能夠分紅 db first (須要先本身登錄數據庫創建表結構,此後通過執行會自動建立相應的類,對錶結構進行操做的時候,能夠直接對這些類進行操做來完成),code first(先寫代碼,建立須要的各類類,而後經過執行語句,利用建立的類建立數據庫表)兩類。主流的orm是code first類型。
    • 當前django提供的ORM,只能完成對數據庫中的表進行操做,數據庫層面上的操做,還須要在數據庫層面上進行佈局。 
    • 另外須要注意的是,py3.x 的解釋器進行數據庫操做的時候,django默認的數據庫驅動接口是mysqldb,而py3.x 用的數據庫驅動接口是pymysql,因此須要使用前對驅動接口進行設置,在項目名文件目錄下的init文件中,寫入以下內容:
      • import pymysql
        pymysql.install_as_MySQLdb()
    • 建立類
      • 根據類建立數據表
        • 在app下,models.py中,建立類,繼承models.Model。注意,models.py命名不能改,不然會報錯
          • 經過類建立表
          • 在類中,經過models的方法,定義字段,其中可選屬性null=True,定義能夠爲空。例如     username=models.CharField(max_length=32)
          • 建立字段的方法,分爲三大類,字符串、數字、時間、二進制,經常使用的有:CharField定義通常的字符串  IntegerField定義數字    DateField定義日期     DateTimeField定義時間    EmailField 定義郵箱格式     GenericIPAddressField定義IP類型        URLField定義URL          AutoField定義自增列,必須加屬性primary_key=True   
            • 須要注意的是,EmailField、URLField、GenericlPAddressField等類型,基本上是在使用django提供的admin時才能用得上,通常狀況下,就用CharField定義通常的字符串  IntegerField定義數字    DateField定義日期  AutoField定義自增列,必須加屬性primary_key=True   
          • 字段的經常使用參數有:   null——》是否爲空,default——》默認值,primary_key——》主鍵,db_column列名,db_index——》索引,uique——》惟一索引,unique_for_date,unique_for_mounth,unique_for_year,auto_now——》建立時,自動獲取時間,auto_now_add——》更新時,自動獲取當前時間,須要注意的是,使用update對數據進行更新的時候,這種操做的時間不會記錄更新,只有用 ‘=’ 從新賦值,而後save的操做纔會記錄更新時間。choices——》元組形式定義分組,把內容放在內存中,運行的時候admin中顯示的下拉框,實現了連表查詢的顯示效果,而且避免了連表查詢的低效率。      blank——》在admin中,定義是否爲空      verbose_name——》在admin中設置是否爲中文        editable——》設置admin中是否可編輯      error_messages——》錯誤提示        help_text——》在admin中提示信息   validators——》自定義錯誤信息      protocol用於GenericIPAddressField設置ip協議類型
        • settings中,INSTALLED_APPS中,註冊app
        • 經過manage建立表結構,    python manage.py makemigrations            注意,在建立以前,須要把在settings中,把當前app名加入INSTALLED_APPS
        • 用django默認的數據庫是sqlite,若是用mysql,須要,1 在settings中,把數據庫引擎設置修改,
          #DATABASES = {
          # 'default': {
          # 'ENGINE': 'django.db.backends.mysql',
          # 'NAME': 'dbname',
          # 'USER':'root',
          # 'PASSWORD':'mysql',
          # 'HOST':'',
          # 'PORT':'',
          # }
          # }
        • 另外,須要注意的是,利用django使用mysql時引擎默認是用的mysqldb,可是,當前python3.x中,尚未mysqldb。須要在和【項目同名】的文件夾下,__init__文件中,設置
          #import pymysql
          # pymysql.install_as_MySQLdb()
        • 當使用py3.x解釋器,跑django2.0版本的時候,會報錯,django.core.exceptions.ImproperlyConfigured,即版本錯誤。這時,須要在解釋器程序中Python\Python36-32\Lib\site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql 這個目錄下對下面的內容註釋掉
          • if version < (1, 3, 3):
                 raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
        • 執行migrate命令,在數據庫中建立表,相似於數據庫的確認操做, python manage.py migrage
        • 若是要查看orm執行的sql語句,能夠進行settigns中設置後打印,
          •  1 LOGGING = {
             2     'version': 1,
             3     'disable_existing_loggers': False,
             4     'handlers': {
             5         'console':{
             6             'level':'DEBUG',
             7             'class':'logging.StreamHandler',
             8         },
             9     },
            10     'loggers': {
            11         'django.db.backends': {
            12             'handlers': ['console'],
            13             'propagate': True,
            14             'level':'DEBUG',
            15         },
            16     }
            17 }
            View Code
        • 對數據庫的表單結構修改(字段內容)後,即對定義表的類進行修改之後,用manage.py 執行makemigrations,migrate命令進行確認操做。
      • 數據庫單表操做與多表操做(外鍵),增刪改查
      • 根據類對數據庫表中的數據進行各類操做,注意:增長、更新、查詢傳遞參數時,均可以經過 ** 傳遞字典進行操做
        • 增長:    
          • 方式一,直接建立  models . 表名 .objects.create(字段1:數值,字段2……)    當字段較多,能夠先建一個存儲信息的字典,而後把字典穿進去,當傳遞字典時,須要在字典名前加 **           models . 表名 .objects.create(**字典名)        執行的時候是有返回值的,返回的是建立的記錄對象。
          • 方式二,經過建立一個對象信息,而後把保存對象              obj=models . 表名(字段1:數值,字段2……)               obj.save()        執行的時候是有返回值的,返回的是建立的記錄對象。
          • 當定義字段時,使用models.EmailField()    models.GenericIPAddressField()等特殊格式時,若是用    create建立,或者用update更新,都不會有格式驗證。只有在執行django admin時會有格式驗證。
        • 查詢:
          •  models.表名.objects 拿到的是一個能夠對錶進行操做的句柄。
          • all()拿到的是對象形式存儲信息的QuerySet(形式上相似於列表)     models.數據表名.objects.all()
            • 對於查詢的結果,能夠經過 .order_by()進行排序                     models.數據表名.objects.all().order_by()       models.UserInfo.objects.filter(id__gt=1).order_by()
            • .first() 結果中的第一個           .count()對結果進行計數          .last() 結果中的最後一個
          • 利用filter添加where查詢條件,結果也是以QuerySet存儲        models.數據表名.objects.filter(篩選條件),能夠經過「__」實現邏輯模糊查詢。
            •  models.UserInfo.objects.filter(id=1)
            •  models.UserInfo.objects.filter(id__gt=1)
            •  models.UserInfo.objects.filter(id__lt=1)
            •  models.UserInfo.objects.filter(id__gte=1)
            •  models.UserInfo.objects.filter(id__lte=1)
            •  models.UserInfo.objects.filter(name__contains='H')
            •  models.UserInfo.objects.filter(name__icontains='H')
            • 篩選條件中,多條件並列時,能夠直接用「,」對多條件進行鏈接。
          • 另外,用models.數據表名.objects.get(篩選條件) 能取到單條數據,取不到內容或者是取到的結果是有多條時,報錯!須要try一下。須要注意的是,大部分的查詢結果是queryset存儲的結果,但get方法是獲取的單個的對象。
          • models.數據表名.objects.exclude(篩選條件)  能夠實現反向查詢,即選出不知足篩選條件的記錄,並把結果存入queryset中存儲。
          • 通常狀況下,查詢的結果,不管是all()或者是經過fiter()取到的都是queryset形式儲存的對象的序列,再鏈一個values() 拿到的是queryset形式存儲的字典的序列能夠指定取出的字段   例如models.UserInfo.objects.filter(id__gt=1).values(‘id’,'name'),  若是鏈一個values_list() 拿到的則是queryset形式存儲的元組的序列,能夠經過索引值,拿到指定的字段
          • queryset能夠調用的其餘經常使用方法
            • order_by()方法,對queryset結果,按指定規則進行排序,返回值仍然是queryset。排序規則支持多條件,能夠直接用「,」對條件進行鏈接。
            • reverse() 方法,也是queryset進行反向操做時進行調用,返回值仍然是queryset。
            • values(指定鍵值)方法,能夠從queryset的對象列表中,拿到每一個對象的指定鍵值對即字典形式,返回結果以queryset形式存儲的字典鍵值對。
            • values_list(指定鍵值) ,功能相似於values,但不一樣的是,返回的結果是queryset形式存儲的元祖,不含鍵只有值。在取值的時候,用索引值。
            • distinct()  ,主要功能是進行去重。
            • first( )當queryset中有對象時,取到的是第一個對象,沒有對象時,取到的是none。用起來比get方法更方便。
        • 刪除:
          • 方式一,能夠在queryset直接調用delete方法
            • models.數據表名.objects.filter(篩選條件).delete()
          • 方式二,能夠在queryset中利用first,last等取到記錄對象後,直接調用delete
            • models.數據表名.objects.filter(篩選條件).first().delete()
        • 修改(更新):
          • 只能由queryset進行方法調用
            • models.數據表名.objects.filter(篩選條件).update(字段=修改的數值)  
      • 外鍵
        • 定義數據表結構的類中,定義外鍵對應關係。       外鍵關係名 = models.ForeignKey(to=關聯表名,to_field=關聯字段,default=指定默認值, on_delete=models.CASCADE)                                 外鍵關係名_id    ——》外鍵字段(自動)                            on_delete=models.CASCSDE 是在django2.x之後版本加入的,最明顯的一個做用,是避免兩個表之間的數據不一致。models.CASCADE是默認狀況下的取值,另外的取值分別爲:
          • CASCADE:此值設置,是級聯刪除。
            PROTECT:此值設置,是會報完整性錯誤。
            SET_NULL:此值設置,會把外鍵設置爲null,前提是容許爲null。
            SET_DEFAULT:此值設置,會把設置爲外鍵的默認值。
            SET():此值設置,會調用外面的值,能夠是一個函數。
        • 調用執行過程當中,外鍵關係名指向關聯表的對象
        • 當用all(),filter()等方法直接拿到結果的時候,跨表拿內容,直接用 queryset存儲的表對象 外鍵關係名 字段名 」 來獲取                                      例如item.group_foreignkey.name。此時的外鍵關係可理解爲封裝在queryset對象中的子級對象,指向關聯表。
        • 當用values(),或者values_list() 拿到結果的時候,跨表拿內容,不能用 「 . 」   須要改爲雙下劃綫「 __ 」    例如:item.group_foreignkey__name。而且,在用values,或者values_list() 須在視圖函數中完成,
        • 反向查詢外鍵關聯關係表。
        • 一對一關係,其實是對一張字節比較多的表,進行的拆分。創建方式能夠是經過惟一的外鍵,也能夠經過
      • 一對多關係,經過創建外鍵,能夠實現表之間的一對多的關係建立
        • 用創建外鍵關係後,經過  ‘ .外鍵關係_id ’ 能夠獲取從屬表中,保存的外鍵值,利用 ‘ . 外鍵關係 ’ 則能夠直接取得對應的對象,直接用鏈接符 ‘ . ’ 可進一步經過跨表查詢獲取具體的屬性。
        • 一對多關係常見的查詢方式:
          • 若是經過 ‘ . ’ 跨表查詢得到的是外鍵連接的對象,當這個對象中仍然包含其餘的外鍵關係時,能夠依次用  ‘ . ’ 跨表查詢得到
          • 雙下劃綫,實現跨表查詢,當跨表查詢的結果做爲參數使用時,利用 __。例如在,value()中傳遞參數的時候。
      • 多對多關係創建
        • 方式一,經過手動創建第三張表做爲關係表,分別經過外鍵和另外的兩張表創建外鍵關聯,最終實現兩張關聯表之間的多對多
        • 方式二,利用r=models.ManyToManyField() ,在建立原始的關聯表的時候,由django自動建立多對多的第三張關係表。r做爲操做句柄能夠實現對第三張關係表的操做。
          • 利用r操做對應關係的時候,先獲取一張關聯表(建立r的表)中的對象,  例如,  obj=models.關聯表名.get(id=1)
          • 而後經過r對關聯關係進行操做。      obj.r.add(2)   obj.r.add(1,2,3)   obj.r.add(*[3,4,5,6])     obj.r.remove(2,3)   obj.r.clear()     obj.r.set([1,2,3]) 用set設定更新關係時,傳列表不用加*  。      obj.r.all() 拿到的是一個另外一張表的對象, obj.r.filter()  
        • 方式二默認的只能夠建立兩張表之間的關係。若是須要多張表之間創建關係,須要用方式一。
      • 驗證功能

 

  • jquery中的Ajax基本操做
    • 本質上是對提交動做進行了拆解,通常狀況下,瀏覽器發送數據是有頁面刷新動做伴隨發生的,爲了不頁面刷新直接將頁面上原有的數據直接刷掉,利用ajax能夠將這兩步動做進行拆解,並在中間部署一次後臺交互動做。
    • 1 設置綁定ajax的標籤,   例如,         <a id="ajax_test">我是ajax構造提交</a>
    • 2 在視圖中構建ajax後臺函數,
    • 3, 在路由urls中綁定url ,指向後臺ajax函數  
    • 4,在html中給設置的ajax標籤,綁定動做事件,及url,type,data,datatype,sucess等,例如
      •  1 $('#ajax_test').click(function(){
         2               $.ajax({
         3                   url:"/ajaxTest/",
         4                   type:'POST',
         5                   data:{'hostname':$("#hostname").val(),"ip":$("#ip").val(),"port":$("#port").val(),"b_id":$("#b_id").val()},
         6                   dataType:"JSON",
         7                   success:function(redata){
         8                       if(redata=='ok'){
         9                           location.reload();
        10                       }else{
        11                          alert(redata)
        12                      }
        13                   }
        14               })
        15               })
        View Code
      • url 便是提交的目標url地址
      • 其中提交的type,有GET,POST,JSON等類型
      • data的數據能夠用serialize打包發送。    例如: data:$(經過class或id等找到form標籤).serialize()  ;     若是隻是發送部分form的部份內容,只須要獲取標籤的內容,而後以鍵值對的形式進行發送。    例如  : data:{'username':$( 'form input[name="username"]' ) }
      • 若是發送的數據中,有多選的,例如select(multiple) 、checkbox等,或者data的鍵值對的內容包含列表,須要在ajax參數中 設置 traditional:true   ,這樣,多選的數據會打包成列表發送至後臺,後臺函數取這類打包成列表的值得時候,須要用getlist。
      • ajax操做,後臺若是是return redirect,沒法接收到數據。若是是return HttpResponse 能夠順利的經過JSON序列化與反序列化進行功能對接,當return render時,後臺返回的頁面內容也是字符串形式,不能自動執行,須要進一步處理。 
        • 通常狀況下,一般是讓後臺返回的數據利用json以字典形式的字符串進行發送。  return HttpResponse(Json.dumps(字典))  ,前段接收後利用  var obj=json.parse( data ) 進行解析。
      • 當使用ajax時,須要跳轉的狀況下,能夠在接收完後臺數據後,利用,location reload()進行頁面刷新   、location.href="  "跳轉至下一級頁面,或者location.replace() 完成頁面跳轉
    • 除了$.ajax ,jquery還支持 $.get , $.port , $.getjson  等方法來提交ajax請求,本質上,其餘方法內部是調用了 $.ajax方法,對其中參數進行修改來完成的。

 

  •  分頁操做
    • 方式一,直接在視圖函數中,對內容進行切分。
      • 1 獲取內容列表及其長度
      • 2 設定每頁顯示的信息的數量,頁碼顯示數量等
      • 3 根據設定的信息數量,切片出顯示在當前頁的信息
      • 4 根據頁碼顯示的設置,配置顯示頁碼起始,造成標籤文本
      • 5 給頁碼的文本內容,貼上safe,    views函數中給文本 mark_safe處理或者在html 用{      |safe}              默認的是不容許傳輸內容中包括html代碼的,防止XSS攻擊
        • xss攻擊:XSS是一種常常出如今web應用中的計算機安全漏洞,它容許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。好比這些代碼包括HTML代碼和客戶端腳本。攻擊者利用XSS漏洞旁路掉訪問控制——例如同源策略(same origin policy)。這種類型的漏洞因爲被駭客用來編寫危害性更大的網絡釣魚(Phishing)攻擊而變得廣爲人知。對於跨站腳本攻擊,駭客界共識是:跨站腳本攻擊是新型的「緩衝區溢出攻擊「,而JavaScript是新型的「ShellCode」。
      • 返回內容設置 renturn render()
    • 方式二,將函數中的處理步驟,封裝到模塊的類中,實例化後,基於實例化的分頁對象作處理。

 

  •  cookie與session
    • cookie 本質上是保存在客戶端瀏覽器上的鍵值對形式存儲的一個文件,明顯地下降了服務器端的信息存儲壓力。注意的是,若是一些敏感信息放在cookie中,那內容會容易被看見
      • 常見應用及方法
        • 在服務端經過用戶請求,利用request.COOKIES 獲得的是一個字典。能夠用 request.COOKIES.get()   或者 request.COOKIES[  ] 取值
        • 給用戶返回信息的時候,能夠進行cookie設置,例如     給用戶返回的信息是 response=redirect('/index/') 設置cookie  response.set_cookie("key","value")  提交返回信息  return response
      • cookie經常使用參數
        • key      鍵
        • value    值
        • max_age    設置超時時間(以秒爲單位),默認是None    例如, res.set_cookie("user111",'val', max_age=10)
        • expires        超時時間(是datetime類型)   例如,設置保持登陸到具體時間點     exp_date = datetime.datetime.utcnow() + datetime.timedelta(seconds= **)     res.set_cookie("user111","value",expires=exp_date)
        • path      設置cookie生效路徑,默認是「/」 表示根路徑,根路徑的cookie能夠被任何url頁面訪問
        • domain      默認是None,能夠設置cookie生效的域名
        • secure      默認是False,管理https傳輸
        • httponly   只能http協議傳輸,沒法被JavaScript獲取(除非是底層抓包等特殊處理)
        • salt     用於給cookie加密,加密和解密的salt必須一致
      • 利用jquery.cookie插件能夠對cookie進行進一步操做
    • session是保存在服務器端的鍵值對文件。
      • session的建立細節,其實是由django自動完成的,由1 生成隨機字符串    2 給客戶瀏覽器寫入cookie   3 把字符串存到session中  4在隨機字符串對應的字典中完成相關內容的設置
      • session是依賴於cookie的
      • session建立,在request中,直接設置。         request.session['username']=user**
      • 在使用session以前,必需要執行一遍migarate。在django中,默認狀況下,session是保存在數據庫中的
      • 調取session的時候                    request.session['username'] 
      • session經常使用操做和方法
        • request.session['user']                               獲取session,鍵爲‘user’的值,不存在,則報錯
        • request.session.get('user',None)               獲取session,鍵爲‘user’的值,不存在時,返回默認值,這裏是None
        • request.session['user']='abc111'               session中‘user’ 若是存在,則改,不存在則建立
        • request.session.setdefault('user','abc222')     單純新建,若是有‘user’,不操做
        • del request.session['user']                          刪除鍵值對‘user’
        • reques.session.clear()                               刪除當前登陸的session全部信息,註銷用
        • request.session.keys()
        • request.session.values()
        • request.session.items()
        • request.session.iterkeys()
        • request.session.itervalues()
        • request.session.iteriterms()
        • request.session.session_key                    獲取用戶的session中隨機字符串
        • request.session.clear_expired()               清除session中失效日期小於指定日期的數據,默認是當前時間
        • request.session.exists('session_key')      檢查用戶session隨機字符串,在數據庫中是否存在(是否註銷)
        • request.session.delete('session_key')     刪除當前用戶的全部session數據,註銷
        • request.session.set_expiry(value)   設置超時時間,默認django的session超時時間是2周
          • 若是value是整數,表示超時時間是讀秒
          • 若是是detetime或timedelta,表示具體的超市時間點
          • 若是是0,用戶關閉當前瀏覽器,session失效
          • 若是是None, 當前的session的有效期依賴於全局session
      • 配置settings.py引擎配置和通用配置  ,設置或修改一些默認操做。
        • SESSION_ENGINE='django.contrib.sessions.backends.db'   配置session的引擎,默認即數據庫
          • 修改session引擎,至緩存。  設置引擎爲cache     SESSION_ENGINE='django.contrib.sessions.backends.cache'    設置要連接的cache      SESSION_CACHE_ALIAS='default'         設置cache的連接    CACHE={ ‘default’:{‘BACKED’:'django.core.cache.backends.memcached.MemcachedCache'    'LOCATION':[IP地址列表]   }       ‘db1’:{‘BACKED’:'django.core.cache.backends.memcached.MemcachedCache'    'LOCATION':[IP地址列表]  }   }
          • 修改session引擎,至文件。     設置引擎爲file       SESSION_ENGINE='django.contrib.sessions.backends.file'            設置要保存的文件路徑,不設置的話會建立一個臨時目錄     SESSION_FILE_PATH=os.path.join(BASE_DIR,'cache')
          • 引擎能夠設置爲數據庫+緩存     引擎配置爲    SESSION_ENGINE='django.contrib.sessions.backends.cache_db'    緩存相關設置  連接 + cache設置
          • 能夠設置爲加密cookie_Session,此時session信息加密保存在客戶端     引擎配置:SESSION_ENGINE='django.contrib.sessions.backends.signed_cookies'    
        • SESSION_COOKIE_NAME=「sessionid」      session的cookie保存在瀏覽器上的key,即   sessionid=產生的隨機字符串
        •  SESSION_COOKIE_PATH=‘/’           session的cookie保存的路徑
        • SESSION_COOKIE_DOMAIN=None          session的cookie保存的域名
        • SESSION_COOKIE_SECURE=False          是否https傳輸cookie
        • SESSION_COOKIE_HTTPONLY=True       是否session的cookie只支持http傳輸
        • SESSION_COOKIE_AGE=1209600              session的cookie失效日期,默認兩週即1209600秒
        • SESSION_COOKIE_BROWSER_CLOSE=False   是否關閉瀏覽器即便得session失效
        • SESSION_COOKIE_REQUEST=False          是否每次請求都從新保存session,默認是不保存
    • 中間件 MIDDLEWARE   
      • 中間件,也稱管道或handler,在settings文件中,本質上是一個繼承自 django.utils.deprecation 中的MiddlewareMixin類的 類的集合
      • 中間件的執行過程自上而下,逐一執行每一箇中間件的類函數process_request ,若是中間都能經過的話,最終調用views視圖函數,收到視圖函數的反饋信息之後,再反向逐一執行process_response 若是中間都能經過的話,最後將信息反饋給發起請求的客戶。若是在某一步的process_requestt或process_response 中出現異常,或不能經過,會按照不一樣版本的具體要求(有的版本會在本層次直接返回,有的版本會跳轉到最後一層中間件的process_response而後返回),逐層逐層反饋最後將信息發回請求發起端。         
      • 中間件的實用性極高,通常用於對整個函數系統的同一設置或限制
      • 使用自定義中間件,過程
        • 首先,建立包,構建中間件的py文件
        • 在py文件中,從django.utils.deprecation 中導入MiddlewareMixin,而後根據須要繼承MiddlewareMixin構建自定義中間件的類和函數
        • 最後,在settings的MIDDLEWARE中註冊自定義的中間件
      • 中間件中經常使用的基本方法有 
        • process_request(sef,request)       *****                          
        • process_view(self,request,callback,callback_args,callback_kwargs)   *****
        • process_template_response(self,request,response)       *
        • process_exception(self,request,exception)     ***
        • process_response(self,request,response)   *****      
  • 緩存
    • 實際上大部分web框架中是沒有緩存的。但django支持緩存,因爲django是動態web框架,每次請求都會去進行相應操做,當程序訪問量大時壓力明顯,最簡單的方式就是利用緩存。在django中支持的緩存方式包括測試緩存、內存緩存、文件緩存、數據庫緩存以及經過memcache使用遠程機器緩存。不一樣的緩存形式的配置,基本上是以修改緩存引擎爲主。
    • 緩存的5中配置方式:
      • 測試緩存
      • 內存緩存
      • 文件緩存
      • 數據庫緩存
      • memcache緩存
      • 緩存的其餘配置(通用配置)
    • 緩存的3中常見應用,使用的優先級能夠經過請求生命週期來理解,全站緩存優於視圖函數緩存優於局部緩存,
      • 全局緩存
      • 視圖函數緩存
      • 模板中局部緩存
    • 緩存參考:www.cnblogs.com/wupeiqi/articles/5246483.html
  • 信號    
    • 信號的功能及應用場景
    • 內置信號
      • 內置信號類型
      • 內置信號的使用
        • 建立py文件,導入內置信號,信號觸發動做、函數構造及設置,py文件導入__init__文件自動加載
    • 自定義信號     
      • 1 定義信號  
        • 引入 django.dispatch
        • 實例化自定義信號        信號名=dijango.dispatch.Signal(providing_args=["toppings","size"])  括號中爲必要的觸發參數,能夠自定義
      • 2 註冊觸發信號設置  
        • 定義觸發動做、函數
        • 在視圖函數views中,從py文件裏導入自定義的信號
        • 手動觸發信號,  信號名.send(sender="     ",toppings=參數1,size=參數2)
      • 3在信號中註冊函數(定義、優化觸發動做、函數) 
  • django中的 Form 組件
    • form組件參考    https://www.cnblogs.com/wupeiqi/articles/6144178.html
    • django的form組件,使用時,是以繼承forms.Form類,來自定義form類。
    • 其中,類裏面能夠定義字段(主要功能,建立前端輸入區域、輸入內容格式驗證),基本語法,                       字段=fields.字段類型(參數設置,插件設置,錯誤提示)        
      •    經常使用字字段有:    Charfield,RegexField,IntegerField,EmailField
      •    經常使用參數有:required=True/False 設置是否能夠爲空;        max_length最大長度;     min_length 最短長度 ;     label 設置label ;     disabeld=False/True 設置是否可編輯;      label_suffix 設置label內容後綴;   help_text 幫助提示信息
      •    主要內置字段和經常使用參數:
        •   1 Field
            2     required=True,               是否容許爲空
            3     widget=None,                 HTML插件
            4     label=None,                  用於生成Label標籤或顯示內容
            5     initial=None,                初始值
            6     help_text='',                幫助信息(在標籤旁邊顯示)
            7     error_messages=None,         錯誤信息 {'required': '不能爲空', 'invalid': '格式錯誤'}
            8     show_hidden_initial=False,   是否在當前插件後面再加一個隱藏的且具備默認值的插件(可用於檢驗兩次輸入是否一直)
            9     validators=[],               自定義驗證規則
           10     localize=False,              是否支持本地化
           11     disabled=False,              是否能夠編輯
           12     label_suffix=None            Label內容後綴
           13  
           14  
           15 CharField(Field)
           16     max_length=None,             最大長度
           17     min_length=None,             最小長度
           18     strip=True                   是否移除用戶輸入空白
           19  
           20 IntegerField(Field)
           21     max_value=None,              最大值
           22     min_value=None,              最小值
           23  
           24 FloatField(IntegerField)
           25     ...
           26  
           27 DecimalField(IntegerField)
           28     max_value=None,              最大值
           29     min_value=None,              最小值
           30     max_digits=None,             總長度
           31     decimal_places=None,         小數位長度
           32  
           33 BaseTemporalField(Field)
           34     input_formats=None          時間格式化   
           35  
           36 DateField(BaseTemporalField)    格式:2015-09-01
           37 TimeField(BaseTemporalField)    格式:11:12
           38 DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
           39  
           40 DurationField(Field)            時間間隔:%d %H:%M:%S.%f
           41     ...
           42  
           43 RegexField(CharField)
           44     regex,                      自定製正則表達式
           45     max_length=None,            最大長度
           46     min_length=None,            最小長度
           47     error_message=None,         忽略,錯誤信息使用 error_messages={'invalid': '...'}
           48  
           49 EmailField(CharField)      
           50     ...
           51  
           52 FileField(Field)
           53     allow_empty_file=False     是否容許空文件
           54  
           55 ImageField(FileField)      
           56     ...
           57     注:須要PIL模塊,pip3 install Pillow
           58     以上兩個字典使用時,須要注意兩點:
           59         - form表單中 enctype="multipart/form-data"
           60         - view函數中 obj = MyForm(request.POST, request.FILES)
           61  
           62 URLField(Field)
           63     ...
           64  
           65  
           66 BooleanField(Field)  
           67     ...
           68  
           69 NullBooleanField(BooleanField)
           70     ...
           71  
           72 ChoiceField(Field)
           73     ...
           74     choices=(),                選項,如:choices = ((0,'上海'),(1,'北京'),)
           75     required=True,             是否必填
           76     widget=None,               插件,默認select插件
           77     label=None,                Label內容
           78     initial=None,              初始值
           79     help_text='',              幫助提示
           80  
           81  
           82 ModelChoiceField(ChoiceField)
           83     ...                        django.forms.models.ModelChoiceField
           84     queryset,                  # 查詢數據庫中的數據
           85     empty_label="---------",   # 默認空顯示內容
           86     to_field_name=None,        # HTML中value的值對應的字段
           87     limit_choices_to=None      # ModelForm中對queryset二次篩選
           88      
           89 ModelMultipleChoiceField(ModelChoiceField)
           90     ...                        django.forms.models.ModelMultipleChoiceField
           91  
           92  
           93      
           94 TypedChoiceField(ChoiceField)
           95     coerce = lambda val: val   對選中的值進行一次轉換
           96     empty_value= ''            空值的默認值
           97  
           98 MultipleChoiceField(ChoiceField)
           99     ...
          100  
          101 TypedMultipleChoiceField(MultipleChoiceField)
          102     coerce = lambda val: val   對選中的每個值進行一次轉換
          103     empty_value= ''            空值的默認值
          104  
          105 ComboField(Field)
          106     fields=()                  使用多個驗證,以下:即驗證最大長度20,又驗證郵箱格式
          107                                fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
          108  
          109 MultiValueField(Field)
          110     PS: 抽象類,子類中能夠實現聚合多個字典去匹配一個值,要配合MultiWidget使用
          111  
          112 SplitDateTimeField(MultiValueField)
          113     input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
          114     input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
          115  
          116 FilePathField(ChoiceField)     文件選項,目錄下文件顯示在頁面中
          117     path,                      文件夾路徑
          118     match=None,                正則匹配
          119     recursive=False,           遞歸下面的文件夾
          120     allow_files=True,          容許文件
          121     allow_folders=False,       容許文件夾
          122     required=True,
          123     widget=None,
          124     label=None,
          125     initial=None,
          126     help_text=''
          127  
          128 GenericIPAddressField
          129     protocol='both',           both,ipv4,ipv6支持的IP格式
          130     unpack_ipv4=False          解析ipv4地址,若是是::ffff:192.0.2.1時候,可解析爲192.0.2.1, PS:protocol必須爲both才能啓用
          131  
          132 SlugField(CharField)           數字,字母,下劃線,減號(連字符)
          133     ...
          134  
          135 UUIDField(CharField)           uuid類型
          136     ...
          View Code
      • 插件設置,經常使用格式 例如,widget=widgets. PasswordInput(attrs={'class':'c01'})         widget=widgets.Textarea(attrs={'class:c002'})              widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'))ajax

      • 主要插件
        •  1 TextInput(Input)
           2 NumberInput(TextInput)
           3 EmailInput(TextInput)
           4 URLInput(TextInput)
           5 PasswordInput(TextInput)
           6 HiddenInput(TextInput)
           7 Textarea(Widget)
           8 DateInput(DateTimeBaseInput)
           9 DateTimeInput(DateTimeBaseInput)
          10 TimeInput(DateTimeBaseInput)
          11 CheckboxInput
          12 Select
          13 NullBooleanSelect
          14 SelectMultiple
          15 RadioSelect
          16 CheckboxSelectMultiple
          17 FileInput
          18 ClearableFileInput
          19 MultipleHiddenInput
          20 SplitDateTimeWidget
          21 SplitHiddenDateTimeWidget
          22 SelectDateWidget
          View Code
        •  經常使用選擇插件設置距離
          •  1 # 單radio,值爲字符串
             2 # user = fields.CharField(
             3 #     initial=2,
             4 #     widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
             5 # )
             6  
             7 # 單radio,值爲字符串
             8 # user = fields.ChoiceField(
             9 #     choices=((1, '上海'), (2, '北京'),),
            10 #     initial=2,
            11 #     widget=widgets.RadioSelect
            12 # )
            13  
            14 # 單select,值爲字符串
            15 # user = fields.CharField(
            16 #     initial=2,
            17 #     widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
            18 # )
            19  
            20 # 單select,值爲字符串
            21 # user = fields.ChoiceField(
            22 #     choices=((1, '上海'), (2, '北京'),),
            23 #     initial=2,
            24 #     widget=widgets.Select
            25 # )
            26  
            27 # 多選select,值爲列表
            28 # user = fields.MultipleChoiceField(
            29 #     choices=((1,'上海'),(2,'北京'),),
            30 #     initial=[1,],
            31 #     widget=widgets.SelectMultiple
            32 # )
            33  
            34  
            35 # 單checkbox
            36 # user = fields.CharField(
            37 #     widget=widgets.CheckboxInput()
            38 # )
            39  
            40  
            41 # 多選checkbox,值爲列表
            42 # user = fields.MultipleChoiceField(
            43 #     initial=[2, ],
            44 #     choices=((1, '上海'), (2, '北京'),),
            45 #     widget=widgets.CheckboxSelectMultiple
            46 # )
            47 在使用選擇標籤時,須要注意choices的選項能夠從數據庫中獲取,可是因爲是靜態字段 ***獲取的值沒法實時更新***,那麼須要自定義構造方法從而達到此目的。
            View Code
      • 異常信息設置,   error_message={異常信息:反饋內容}     例如,error_message={'required':'信息不能爲空',‘min_length’:'不能小於長度** ',‘max_length’:' 長度不能超過** '}   
      • 在定義的視圖函數中,實例化定義的form類
        • 把實例化的form對象obj(能夠不傳任何參數進去,此時新建空表,也能夠先定義一個字典,鍵取自定義的form類值爲設定的初始化值,而後把字典用initial實例化對象的時候傳進去,這樣創建的表單裏會有初始化的默認值)     ,render回前端,可生成form表單
          • 前端的html中,能夠經過替換obj中的 字段,生成表單內容,能夠把出錯的提示信息放一塊  , 例如,     <p>   {{obj.user}}  {{obj.errors.user.0}} </p>
          • 也能夠進一步簡化,不單獨替換具體字段,而是用obj對象的方法 {{obj.as_p}}   、     {{obj.as_ul}}       或者  <table> {{obj.as_table}}</table>
        • 實例化對象,把request.POST 傳進去,可用對象驗證輸入信息、接收驗證信息,並返回對應的錯誤信息
          • 此時   obj.is_valid() 可驗證數據是否全都有效合法,    obj.clean_data 可接收前端傳過來的信息,以字典形式存儲     obj.errors 可蒐集錯誤信息,總體以字典形式存儲,字段爲鍵,對應的錯誤信息以列表形式存儲做爲字典的值
          • 若是, obj.is_valid()   數據經過驗證即爲True,根據須要選擇反饋內容  ;  若是是False,則render的時候,把obj直接傳回去,這時,obj中既有前端以前的輸入信息,也有錯誤信息和對應的提示內容
    • 驗證重要節點,
      •   is_valid——》每一個字段的內置正則+clean_字段——》clean(__all__)——》_post_clean  
      • clean_data
      • errors  
  • ModelForm
    • model+form,能夠實現驗證也同時能夠數據操做  
    • 基本功能
      • 生成html標籤:class Meta:
      • 頁面顯示,生成時帶默認值。在建立時,  mf = ***ModelForm(instance=ModelObj)
      • 加額外的標籤或定製字段,  is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput())
      • 各類驗證    is_valid()    ……   ,相似於form中的驗證節點
      • 保存,直接  mf.save()     ,或者  instance = mf.save(False)   instance.save()   my.save_m2m()
相關文章
相關標籤/搜索