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

首頁 > 編程 > Python > 正文

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

2020-01-04 18:02:40
字體:
供稿:網(wǎng)友

這篇文章主要介紹了簡單解析Django框架中的表單驗證,Django是Python重多人氣框架中最為著名的一個,需要的朋友可以參考下

我們的搜索示例仍然相當?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驗證可以看作是額外的功能,但不能作為唯一的驗證功能。

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

 

 
  1. def search(request): 
  2. error = False 
  3. if 'q' in request.GET: 
  4. q = request.GET['q'
  5. if not q: 
  6. error = True 
  7. **elif len(q) > 20:** 
  8. **error = True** 
  9. else
  10. books = Book.objects.filter(title__icontains=q) 
  11. return render_to_response('search_results.html'
  12. {'books': books, 'query': q}) 
  13. return render_to_response('search_form.html'
  14. {'error': error}) 

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

 

 
  1. <html> 
  2. <head> 
  3. <title>Search</title> 
  4. </head> 
  5. <body> 
  6. {% if error %} 
  7. <p style="color: red;">Please submit a search term 20 characters or shorter.</p> 
  8. {% endif %} 
  9. <form action="/search/" method="get"
  10. <input type="text" name="q"
  11. <input type="submit" value="Search"
  12. </form> 
  13. </body> 
  14. </html> 

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

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

 

 
  1. def search(request): 
  2. **errors = []** 
  3. if 'q' in request.GET: 
  4. q = request.GET['q'
  5. if not q: 
  6. **errors.append('Enter a search term.')** 
  7. elif len(q) > 20: 
  8. **errors.append('Please enter at most 20 characters.')** 
  9. else
  10. books = Book.objects.filter(title__icontains=q) 
  11. return render_to_response('search_results.html'
  12. {'books': books, 'query': q}) 
  13. return render_to_response('search_form.html'
  14. {**'errors': errors** }) 

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

 

 
  1. <html> 
  2. <head> 
  3. <title>Search</title> 
  4. </head> 
  5. <body> 
  6. **{% if errors %}** 
  7. **<ul>** 
  8. **{% for error in errors %}** 
  9. **<li>{{ error }}</li>** 
  10. **{% endfor %}** 
  11. **</ul>** 
  12. **{% endif %}** 
  13. <form action="/search/" method="get"
  14. <input type="text" name="q"
  15. <input type="submit" value="Search"
  16. </form> 
  17. </body> 
  18. </html> 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 彝良县| 巴塘县| 阿拉善左旗| 上虞市| 平潭县| 兴海县| 桑日县| 河北省| 渑池县| 延川县| 永川市| 平顶山市| 江都市| 桐庐县| 涟水县| 读书| 泾源县| 密云县| 武功县| 长宁县| 黄冈市| 富蕴县| 鸡西市| 南漳县| 吐鲁番市| 上高县| 沂水县| 宜州市| 攀枝花市| 城步| 米脂县| 基隆市| 盐亭县| 彭山县| 故城县| 开原市| 玉山县| 东台市| 柳林县| 乌拉特前旗| 静宁县|