` 元素前面添加一个搜索框,供用户输入想 搜索的分类。
```
```
在模板中添加这些元素之后,编写 jQuery 代码,在用户输入的过程中更新分类列表。
为 #suggestion 输入框注册一个按键事件句柄:$('#suggestion').keyup(function(){ … })。在键 盘回升时通过 .get() 函数发起一个 Ajax 请求($(this).get(…)),获取更新的分类列表。如果请 求成功,使用 .html() 函数,把 #cats 元素的内容替换掉($('#cats').html(data))。
### 定义辅助函数
我们可以定义一个辅助方法,使用过滤器查找以指定字符串开头的分类。我们要使用的过滤器是 istartwith,即不区分字母的大小写。如果想区分大小写,使用 startswith。
```
def get_category_list(max_results=0, starts_with=''):
cat_list = []
if starts_with:
cat_list = Category.objects.filter(name__istartswith=starts_with)
if max_results > 0:
if len(cat_list) > max_results:
cat_list = cat_list[:max_results]
return cat_list
```
### 编写视图
编写一个视图,调用 get_category_list() 函数,获取匹配条件的前 8 个分类。
```
def suggest_category(request):
cat_list = []
starts_with = ''
if request.method == 'GET':
starts_with = request.GET['suggestion']
cat_list = get_category_list(8, starts_with)
return render(request, 'rango/cats.html', {'cats': cat_list })
```
注意,这个视图重用了 rango/cats.html 模板。
### 映射 URL
打开 rango/urls.py 模块,把下述代码添加到 urlpatterns 列表中:
```
url(r'^suggest/$', views.suggest_category, name='suggest_category'),
```
### 更新基模板
在基模板的侧边栏中添加下述 HTML 标记:
```
```
我们添加了一个 ID 为 suggestion 的输入框,以及一个 ID 为 cats 的 `
`元素,用于显示分类 建议。这里无需添加按钮,因为我们将为输入框的按键事件注册一个事件句柄,通过 Ajax 获取分类建议。
把模板中的下面三行代码删除:
```
{% block sidebar_block %}
{% get_category_list category %}
{% endblock %}
```
### 通过 Ajax 请求获取分类建议
在 js/rango-ajax.js 文件中添加下述 jQuery 代码:
```
$('#suggestion').keyup(function(){
var query; query = $(this).val();
$.get('/rango/suggest/', {suggestion: query}, function(data){
$('#cats').html(data); });
});
```
我们为 ID 为 suggestion 的输入元素注册了一个句柄,在按键回升事件触发时执行。该事件触发 时,把输入框中的内容赋值给 query 变量,然后向 /rango/suggest/ 发起 Ajax GET 请求。如果请求 成功,更新 ID 为 cats 的元素,把里面的内容替换为得到的分类建议。

图 16-1:行内分类建议示例。注意建议的分类在输入的过程中是有变化的。