国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

簡單解析Django框架中的表單驗證

2019-11-25 17:10:13
字體:
來源:轉載
供稿:網(wǎng)友

我們的搜索示例仍然相當?shù)睾唵危貏e從數(shù)據(jù)驗證方面來講;我們僅僅只驗證搜索關鍵值是否為空。 然后許多HTML表單包含著比檢測值是否為空更為復雜的驗證。 我們都有在網(wǎng)站上見過類似以下的錯誤提示信息:

  •     請輸入一個有效的email地址, foo' 并不是一個有效的e-mail地址。
  •     請輸入5位數(shù)的U.S 郵政編碼, 123并非是一個有效的郵政編碼。
  •     請輸入YYYY-MM-DD格式的日期。
  •     請輸入8位數(shù)以上并至少包含一個數(shù)字的密碼。

關于JavaScript驗證

可以使用Javascript在客戶端瀏覽器里對數(shù)據(jù)進行驗證,這些知識已超出本書范圍。 要注意: 即使在客戶端已經(jīng)做了驗證,但是服務器端仍必須再驗證一次。 因為有些用戶會將JavaScript關閉掉,并且還有一些懷有惡意的用戶會嘗試提交非法的數(shù)據(jù)來探測是否有可以攻擊的機會。

除了在服務器端對用戶提交的數(shù)據(jù)進行驗證(例如在視圖里驗證),我們沒有其他辦法。 JavaScript驗證可以看作是額外的功能,但不能作為唯一的驗證功能。

我們來調整一下search()視圖,讓她能夠驗證搜索關鍵詞是否小于或等于20個字符。 (為來讓例子更為顯著,我們假設如果關鍵詞超過20個字符將導致查詢十分緩慢)。那么該如何實現(xiàn)呢? 最簡單的方式就是將邏輯處理直接嵌入到視圖里,就像這樣:

def search(request):  error = False  if 'q' in request.GET:    q = request.GET['q']    if not q:      error = True    **elif len(q) > 20:**      **error = True**    else:      books = Book.objects.filter(title__icontains=q)      return render_to_response('search_results.html',        {'books': books, 'query': q})  return render_to_response('search_form.html',    {'error': error})

現(xiàn)在,如果嘗試著提交一個超過20個字符的搜索關鍵詞,系統(tǒng)不會執(zhí)行搜索操作,而是顯示一條錯誤提示信息。 但是,search_form.html里的這條提示信息是:”Please submit a search term.”,這顯然是錯誤的, 所以我們需要更精確的提示信息:

<html><head>  <title>Search</title></head><body>  {% if error %}    <p style="color: red;">Please submit a search term 20 characters or shorter.</p>  {% endif %}  <form action="/search/" method="get">    <input type="text" name="q">    <input type="submit" value="Search">  </form></body></html>

但像這樣修改之后仍有一些問題。 我們包含萬象的提示信息很容易使人產(chǎn)生困惑: 提交一個空表單怎么會出現(xiàn)一個關于20個字符限制的提示? 所以,提示信息必須是詳細的,明確的,不會產(chǎn)生疑議。

問題的實質在于我們只使用來一個布爾類型的變量來檢測是否出錯,而不是使用一個列表來記錄相應的錯誤信息。 我們需要做如下的調整:

def search(request):  **errors = []**  if 'q' in request.GET:    q = request.GET['q']    if not q:      **errors.append('Enter a search term.')**    elif len(q) > 20:      **errors.append('Please enter at most 20 characters.')**    else:      books = Book.objects.filter(title__icontains=q)      return render_to_response('search_results.html',        {'books': books, 'query': q})  return render_to_response('search_form.html',    {**'errors': errors** })

接著,我們要修改一下search_form.html模板,現(xiàn)在需要顯示一個errors列表而不是一個布爾判斷。

<html><head>  <title>Search</title></head><body>  **{% if errors %}**    **<ul>**      **{% for error in errors %}**      **<li>{{ error }}</li>**      **{% endfor %}**    **</ul>**  **{% endif %}**  <form action="/search/" method="get">    <input type="text" name="q">    <input type="submit" value="Search">  </form></body></html>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 廉江市| 宁海县| 昭平县| 安顺市| 五家渠市| 广汉市| 丰镇市| 六安市| 泰州市| 贺兰县| 南昌县| 马边| 大洼县| 璧山县| 南漳县| 水富县| 内乡县| 阿巴嘎旗| 仁布县| 东阿县| 金阳县| 嵊泗县| 五大连池市| 宜丰县| 翼城县| 屏山县| 云梦县| 东丰县| 兰西县| 全椒县| 莱州市| 明水县| 老河口市| 星子县| 丹江口市| 大余县| 荃湾区| 农安县| 武邑县| 瓮安县| 卢氏县|