這篇文章主要介紹了簡單解析Django框架中的表單驗證,Django是Python重多人氣框架中最為著名的一個,需要的朋友可以參考下
我們的搜索示例仍然相當地簡單,特別從數據驗證方面來講;我們僅僅只驗證搜索關鍵值是否為空。 然后許多HTML表單包含著比檢測值是否為空更為復雜的驗證。 我們都有在網站上見過類似以下的錯誤提示信息:
請輸入一個有效的email地址, foo' 并不是一個有效的e-mail地址。
請輸入5位數的U.S 郵政編碼, 123并非是一個有效的郵政編碼。
請輸入YYYY-MM-DD格式的日期。
請輸入8位數以上并至少包含一個數字的密碼。
關于JavaScript驗證
可以使用Javascript在客戶端瀏覽器里對數據進行驗證,這些知識已超出本書范圍。 要注意: 即使在客戶端已經做了驗證,但是服務器端仍必須再驗證一次。 因為有些用戶會將JavaScript關閉掉,并且還有一些懷有惡意的用戶會嘗試提交非法的數據來探測是否有可以攻擊的機會。
除了在服務器端對用戶提交的數據進行驗證(例如在視圖里驗證),我們沒有其他辦法。 JavaScript驗證可以看作是額外的功能,但不能作為唯一的驗證功能。
我們來調整一下search()視圖,讓她能夠驗證搜索關鍵詞是否小于或等于20個字符。 (為來讓例子更為顯著,我們假設如果關鍵詞超過20個字符將導致查詢十分緩慢)。那么該如何實現呢? 最簡單的方式就是將邏輯處理直接嵌入到視圖里,就像這樣:
- 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})
現在,如果嘗試著提交一個超過20個字符的搜索關鍵詞,系統不會執行搜索操作,而是顯示一條錯誤提示信息。 但是,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>
但像這樣修改之后仍有一些問題。 我們包含萬象的提示信息很容易使人產生困惑: 提交一個空表單怎么會出現一個關于20個字符限制的提示? 所以,提示信息必須是詳細的,明確的,不會產生疑議。
問題的實質在于我們只使用來一個布爾類型的變量來檢測是否出錯,而不是使用一個列表來記錄相應的錯誤信息。 我們需要做如下的調整:
- 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模板,現在需要顯示一個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>
新聞熱點
疑難解答