這篇文章主要介紹了改進Django中的表單的簡單方法,Django是Python重多人氣框架中最著名的一個,需要的朋友可以參考下
首先,search()視圖對于空字符串的處理相當薄弱——僅顯示一條”Please submit a search term.”的提示信息。 若用戶要重新填寫表單必須自行點擊“后退”按鈕, 這種做法既糟糕又不專業。如果在現實的案例中,我們這樣子編寫,那么Django的優勢將蕩然無存。
在檢測到空字符串時更好的解決方法是重新顯示表單,并在表單上面給出錯誤提示以便用戶立刻重新填寫。 最簡單的實現方法既是添加else分句重新顯示表單,代碼如下:
- from django.http import HttpResponse
- from django.shortcuts import render_to_response
- from mysite.books.models import Book
- def search_form(request):
- return render_to_response('search_form.html')
- def search(request):
- if 'q' in request.GET and request.GET['q']:
- q = request.GET['q']
- books = Book.objects.filter(title__icontains=q)
- return render_to_response('search_results.html',
- {'books': books, 'query': q})
- else:
- **return render_to_response('search_form.html', {'error': True})**
(注意,將search_form()視圖也包含進來以便查看)
這段代碼里,我們改進來search()視圖:在字符串為空時重新顯示search_form.html。 并且給這個模板傳遞了一個變量error,記錄著錯誤提示信息。 現在我們編輯一下search_form.html,檢測變量error:
- <html>
- <head>
- <title>Search</title>
- </head>
- <body>
- **{% if error %}**
- **<p style="color: red;">Please submit a search term.</p>**
- **{% endif %}**
- <form action="/search/" method="get">
- <input type="text" name="q">
- <input type="submit" value="Search">
- </form>
- </body>
- </html>
我們修改了search_form()視圖所使用的模板,因為search_form()視圖沒有傳遞error變量,所以在條用search_form視圖時不會顯示錯誤信息。
通過上面的一些修改,現在程序變的好多了,但是現在出現一個問題: 是否有必要專門編寫search_form()來顯示表單? 按實際情況來說,當一個請求發送至/search/(未包含GET的數據)后將會顯示一個空的表單(帶有錯誤信息)。 所以,只要我們改變search()視圖:當用戶訪問/search/并未提交任何數據時就隱藏錯誤信息,這樣就移去search_form()視圖以及對應的URLpattern。
- def search(request):
- error = False
- if 'q' in request.GET:
- q = request.GET['q']
- if not q:
- 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})
在改進后的視圖中,若用戶訪問/search/并且沒有帶有GET數據,那么他將看到一個沒有錯誤信息的表單; 如果用戶提交了一個空表單,那么它將看到錯誤提示信息,還有表單; 最后,若用戶提交了一個非空的值,那么他將看到搜索結果。
最后,我們再稍微改進一下這個表單,去掉冗余的部分。 既然已經將兩個視圖與URLs合并起來,/search/視圖管理著表單的顯示以及結果的顯示,那么在search_form.html里表單的action值就沒有必要硬編碼的指定URL。 原先的代碼是這樣:
- <form action="/search/" method="get">
現在改成這樣:
- <form action="" method="get">
action=”“意味著表單將提交給與當前頁面相同的URL。 這樣修改之后,如果search()視圖不指向其它頁面的話,你將不必再修改action。
新聞熱點
疑難解答