Django之ModelForm元件
ModelForm
a. class Meta:
model, # 對應Model的
fields=None, # 字段
exclude=None, # 排除字段
labels=None, # 提示資訊
help_texts=None, # 幫助提示資訊
widgets=None, # 自定義插件
error_messages=None, # 自定義錯誤資訊(整體錯誤資訊from django.core.exceptions import NON_FIELD_ERRORS)
field_classes=None # 自定義字段類 (也可以自定義字段)
localized_fields=('birth_date',) # 本地化,如:根據不同時區顯示資料
如:
資料庫中
2016-12-27 04:10:57
setting中的配置
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = True
則顯示:
2016-12-27 12:10:57
b. 驗證執行過程
is_valid -> full_clean -> 鈎子 -> 整體錯誤
c. 字典字段驗證
def clean_字段名(self):
# 可以抛出異常
# from django.core.exceptions import ValidationError
return "新值"
d. 用于驗證
model_form_obj = XXOOModelForm()
model_form_obj.is_valid()
model_form_obj.errors.as_json()
model_form_obj.clean()
model_form_obj.cleaned_data
e. 用于建立
model_form_obj = XXOOModelForm(request.POST)
#### 頁面顯示,并送出 #####
# 預設儲存多對多
obj = form.save(commit=True)
# 不做任何操作,内部定義 save_m2m(用于儲存多對多)
obj = form.save(commit=False)
obj.save() # 儲存單表資訊
obj.save_m2m() # 儲存關聯多對多資訊
f. 用于更新和初始化
obj = model.tb.objects.get(id=1)
model_form_obj = XXOOModelForm(request.POST,instance=obj)
...
PS: 單純初始化
model_form_obj = XXOOModelForm(initial={...})
AJAX
對于WEB應用程式:使用者浏覽器發送請求,伺服器接收并處理請求,然後傳回結果,往往傳回就是字元串(HTML),浏覽器将字元串(HTML)渲染并顯示浏覽器上。
1、傳統的Web應用
一個簡單操作需要重新加載全局資料
2、AJAX
AJAX,Asynchronous JavaScript and XML (異步的JavaScript和XML),一種建立互動式網頁應用的網頁開發技術方案。
異步的JavaScript:
使用 【JavaScript語言】 以及 相關【浏覽器提供類庫】 的功能向服務端發送請求,當服務端處理完請求之後,【自動執行某個JavaScript的回調函數】。
PS:以上請求和響應的整個過程是【偷偷】進行的,頁面上無任何感覺。
XML:XML是一種标記語言,是Ajax在和背景互動時傳輸資料的格式之一
利用AJAX可以做:
1、注冊時,輸入使用者名自動檢測使用者是否已經存在。
2、登陸時,提示使用者名密碼錯誤
3、删除資料行時,将行ID發送到背景,背景在資料庫中删除,資料庫删除成功後,在頁面DOM中将資料行也删除。
“僞”AJAX
由于HTML标簽的iframe标簽具有局部加載内容的特性,是以可以使用其來僞造Ajax請求。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div>
<p>請輸入要加載的位址:<span id="currentTime"></span></p>
<p>
<input id="url" type="text" />
<input type="button" value="重新整理" onclick="LoadPage();">
</p>
</div>
<div>
<h3>加載頁面位置:</h3>
<iframe id="iframePosition" style="width: 100%;height: 500px;"></iframe>
</div>
<script type="text/javascript">
window.onload= function(){
var myDate = new Date();
document.getElementById('currentTime').innerText = myDate.getTime();
};
function LoadPage(){
var targetUrl = document.getElementById('url').value;
document.getElementById("iframePosition").src = targetUrl;
}
</script>
</body>
</html>
View Code
原生AJAX
Ajax主要就是使用 【XmlHttpRequest】對象來完成請求的操作,該對象在主流浏覽器中均存在(除早起的IE),Ajax首次出現IE5.5中存在(ActiveX控件)。
1、XmlHttpRequest對象介紹
XmlHttpRequest對象的主要方法:
a. void open(String method,String url,Boolen async)
用于建立請求
參數:
method: 請求方式(字元串類型),如:POST、GET、DELETE...
url: 要請求的位址(字元串類型)
async: 是否異步(布爾類型)
b. void send(String body)
用于發送請求
參數:
body: 要發送的資料(字元串類型)
c. void setRequestHeader(String header,String value)
用于設定請求頭
參數:
header: 請求頭的key(字元串類型)
vlaue: 請求頭的value(字元串類型)
d. String getAllResponseHeaders()
擷取所有響應頭
傳回值:
響應頭資料(字元串類型)
e. String getResponseHeader(String header)
擷取響應頭中指定header的值
參數:
header: 響應頭的key(字元串類型)
傳回值:
響應頭中指定的header對應的值
f. void abort()
終止請求
XmlHttpRequest對象的主要屬性:
a. Number readyState
狀态值(整數)
詳細:
0-未初始化,尚未調用open()方法;
1-啟動,調用了open()方法,未調用send()方法;
2-發送,已經調用了send()方法,未接收到響應;
3-接收,已經接收到部分響應資料;
4-完成,已經接收到全部響應資料;
b. Function onreadystatechange
當readyState的值改變時自動觸發執行其對應的函數(回調函數)
c. String responseText
伺服器傳回的資料(字元串類型)
d. XmlDocument responseXML
伺服器傳回的資料(Xml對象)
e. Number states
狀态碼(整數),如:200、404...
f. String statesText
狀态文本(字元串),如:OK、NotFound...
2、跨浏覽器支援
XmlHttpRequest
IE7+, Firefox, Chrome, Opera, etc.
ActiveXObject("Microsoft.XMLHTTP")
IE6, IE5
基于原生AJAX - Demo
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>XMLHttpRequest - Ajax請求</h1>
<input type="button" onclick="XmlGetRequest();" value="Get發送請求" />
<input type="button" onclick="XmlPostRequest();" value="Post發送請求" />
<script src="/statics/jquery-1.12.4.js"></script>
<script type="text/javascript">
function GetXHR(){
var xhr = null;
if(XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
return xhr;
}
function XhrPostRequest(){
var xhr = GetXHR();
// 定義回調函數
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
// 已經接收到全部響應資料,執行以下操作
var data = xhr.responseText;
console.log(data);
}
};
// 指定連接配接方式和位址----檔案方式
xhr.open('POST', "/test/", true);
// 設定請求頭
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
// 發送請求
xhr.send('n1=1;n2=2;');
}
function XhrGetRequest(){
var xhr = GetXHR();
// 定義回調函數
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
// 已經接收到全部響應資料,執行以下操作
var data = xhr.responseText;
console.log(data);
}
};
// 指定連接配接方式和位址----檔案方式
xhr.open('get', "/test/", true);
// 發送請求
xhr.send();
}
</script>
</body>
</html>
View Code
jQuery Ajax
jQuery其實就是一個JavaScript的類庫,其将複雜的功能做了上層封裝,使得開發者可以在其基礎上寫更少的代碼實作更多的功能。
jQuery 不是生産者,而是大自然搬運工。
jQuery Ajax本質 XMLHttpRequest 或 ActiveXObject
注:2.+版本不再支援IE9以下的浏覽器
jQuery Ajax 方法清單
jQuery.get(...)
所有參數:
url: 待載入頁面的URL位址
data: 待發送 Key/value 參數。
success: 載入成功時回調函數。
dataType: 傳回内容格式,xml, json, script, text, html
jQuery.post(...)
所有參數:
url: 待載入頁面的URL位址
data: 待發送 Key/value 參數
success: 載入成功時回調函數
dataType: 傳回内容格式,xml, json, script, text, html
jQuery.getJSON(...)
所有參數:
url: 待載入頁面的URL位址
data: 待發送 Key/value 參數。
success: 載入成功時回調函數。
jQuery.getScript(...)
所有參數:
url: 待載入頁面的URL位址
data: 待發送 Key/value 參數。
success: 載入成功時回調函數。
jQuery.ajax(...)
部分參數:
url:請求位址
type:請求方式,GET、POST(1.9.0之後用method)
headers:請求頭
data:要發送的資料
contentType:即将發送資訊至伺服器的内容編碼類型(預設: "application/x-www-form-urlencoded; charset=UTF-8")
async:是否異步
timeout:設定請求逾時時間(毫秒)
beforeSend:發送請求前執行的函數(全局)
complete:完成之後執行的回調函數(全局)
success:成功之後執行的回調函數(全局)
error:失敗之後執行的回調函數(全局)
accepts:通過請求頭發送給伺服器,告訴伺服器目前用戶端課接受的資料類型
dataType:将伺服器端傳回的資料轉換成指定類型
"xml": 将伺服器端傳回的内容轉換成xml格式
"text": 将伺服器端傳回的内容轉換成普通文本格式
"html": 将伺服器端傳回的内容轉換成普通文本格式,在插入DOM中時,如果包含JavaScript标簽,則會嘗試去執行。
"script": 嘗試将傳回值當作JavaScript去執行,然後再将伺服器端傳回的内容轉換成普通文本格式
"json": 将伺服器端傳回的内容轉換成相應的JavaScript對象
"jsonp": JSONP 格式
使用 JSONP 形式調用函數時,如 "myurl?callback=?" jQuery 将自動替換 ? 為正确的函數名,以執行回調函數
如果不指定,jQuery 将自動根據HTTP包MIME資訊傳回相應類型(an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string
converters: 轉換器,将伺服器端的内容根據指定的dataType轉換類型,并傳值給success回調函數
$.ajax({
accepts: {
mycustomtype: 'application/x-some-custom-type'
},
// Expect a `mycustomtype` back from server
dataType: 'mycustomtype'
// Instructions for how to deserialize a `mycustomtype`
converters: {
'text mycustomtype': function(result) {
// Do Stuff
return newresult;
}
},
});
基于jQueryAjax - Demo
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<p>
<input type="button" onclick="XmlSendRequest();" value='Ajax請求' />
</p>
<script type="text/javascript" src="jquery-1.12.4.js"></script>
<script>
function JqSendRequest(){
$.ajax({
url: "http://c2.com:8000/test/",
type: 'GET',
dataType: 'text',
success: function(data, statusText, xmlHttpRequest){
console.log(data);
}
})
}
</script>
</body>
</html>
View Code
跨域AJAX
由于浏覽器存在同源政策機制,同源政策阻止從一個源加載的文檔或腳本擷取或設定另一個源加載的文檔的屬性。
特别的:由于同源政策是浏覽器的限制,是以請求的發送和響應是可以進行,隻不過浏覽器不接受罷了。
浏覽器同源政策并不是對所有的請求均制約:
制約: XmlHttpRequest
不叼: img、iframe、script等具有src屬性的标簽
跨域,跨域名通路,如:http://www.c1.com 域名向 http://www.c2.com域名發送請求。
1、JSONP實作跨域請求
JSONP(JSONP - JSON with Padding是JSON的一種“使用模式”),利用script标簽的src屬性(浏覽器允許script标簽跨域)
基于JSONP實作跨域Ajax
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<p>
<input type="button" onclick="Jsonp1();" value='送出'/>
</p>
<p>
<input type="button" onclick="Jsonp2();" value='送出'/>
</p>
<script type="text/javascript" src="jquery-1.12.4.js"></script>
<script>
function Jsonp1(){
var tag = document.createElement('script');
tag.src = "http://c2.com:8000/test/";
document.head.appendChild(tag);
document.head.removeChild(tag);
}
function Jsonp2(){
$.ajax({
url: "http://c2.com:8000/test/",
type: 'GET',
dataType: 'JSONP',
success: function(data, statusText, xmlHttpRequest){
console.log(data);
}
})
}
</script>
</body>
</html>
View Code
2、CORS
随着技術的發展,現在的浏覽器可以支援主動設定進而允許跨域請求,即:跨域資源共享(CORS,Cross-Origin Resource Sharing),其本質是設定響應頭,使得浏覽器允許跨域請求。
* 簡單請求 OR 非簡單請求
條件:
1、請求方式:HEAD、GET、POST
2、請求頭資訊:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type 對應的值是以下三個中的任意一個
application/x-www-form-urlencoded
multipart/form-data
text/plain
注意:同時滿足以上兩個條件時,則是簡單請求,否則為複雜請求
* 簡單請求和非簡單請求的差別?
簡單請求:一次請求
非簡單請求:兩次請求,在發送資料之前會先發一次請求用于做“預檢”,隻有“預檢”通過後才再發送一次請求用于資料傳輸。
* 關于“預檢”
- 請求方式:OPTIONS
- “預檢”其實做檢查,檢查如果通過則允許傳輸資料,檢查不通過則不再發送真正想要發送的消息
- 如何“預檢”
=> 如果複雜請求是PUT等請求,則服務端需要設定允許某請求,否則“預檢”不通過
Access-Control-Request-Method
=> 如果複雜請求設定了請求頭,則服務端需要設定允許某請求頭,否則“預檢”不通過
Access-Control-Request-Headers
轉載于:https://www.cnblogs.com/manger/p/6437074.html