Django & JQuery 实现 Autocomplete

输入框自动完成(Autocomplete 或称 Suggest)是一般系统中常见的功能,但是通过Django来实现,于我来说(刚开始接触Python)还是第一次,经过近1天的时间,终于完成了所有的设计中的功能,记录下来,留给其他有需要的同学及自己备忘:

注:因为懒得调整CSS和截图了,所以找了张最终效果与本文基本接近的示意图,特此说明。

运行环境:

设计要求:

  • 基本:提供一个输入框,用户在框中输入数据时系统根据数据库中内容自动提取与之匹配的数据,在输入框下方显示并由用户选取
  • 进阶:输入框下方的提示匹配列表内容可定制,如同时显示产品名称及产品编码,用户选取后结果也可定制,确定采用产品名称或编码均可

实现由3部分组合完成:

  • 前台页面:search.html (提供搜索及结果返回界面,并加载Jquery框架)
  • 数据库模型 :model.py
  • 后台匹配:search.py (根据搜索要求实时提供数据)

search.html 代码

01 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
02 <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
03 <title>Django jQuery Autocomplete</title>
04 <script type="text/javascript" src="./Autocomplete/jquery.js"></script>
05 <script type="text/javascript" src="./Autocomplete/jquery.autocomplete.js"></script>
06 <link rel="stylesheet" type="text/css"href="./Autocomplete/jquery.autocomplete.css">
07  
08 <script type="text/javascript">
09 $().ready(function() {
10  
11     function findValueCallback(event, data, formatted) {
12         $("<li>").html( !data ? "No match!" "Selected: " + formatted).appendTo("#result");
13     }
14  
15     function formatItem(row) {
16         return row[0] + " <strong>产品编码:</strong>" + row[1] ; //此处可定制提示信息
17     }
18     function formatResult(row) {
19         return row[0].replace(/(<.+?>)/gi, '');
20     }
21     $("#suggest").autocomplete('/search/', {
22         width: 300,
23         multiple: false,multipleSeparator: ' ',//此处关闭了多选功能,mulitiple: true为打开 ,mulitipleSeparator为多选时分隔符,默认为','
24         matchContains: true,
25         formatItem: formatItem, //格式化提示选项
26         formatResult: formatResult //格式化结果输出
27     });
28     $("#suggest").result(function(event, data, formatted) {
29         var hidden = $(this).parent().next().find(">:input");
30         hidden.val( (hidden.val() ? hidden.val() + ";" : hidden.val()) + data[1]);
31     });
32 });
33  
34 </script>
35  
36 </head>
37 <body>
38 <div id="content">
39     <form >
40         <p>
41             <label>please input:</label>
42             <textarea id="suggest" class="ac_input"></textarea>
43             <input type="button" value="Get Value">
44         </p>
45         <p>
46             <label>Hidden input</label>
47             <textarea></textarea>
48         </p>
49  
50         <input type="submit" value="Submit">
51     </form>
52  
53     <h3>Result:</h3> <ol id="result"></ol>
54  
55 </div>
56 </body>
57 </html>

models.py

1 class Products(models.Model):
2     name = models.CharField(max_length=60)
3     code = models.CharField(max_length=30)
4     def __unicode__(self):
5         return self.name
6  
7     def _get_full_name(self): #注意此处,很重要,通过加入full_name这一属性,完成了与JS的数据对接
8         return ("%s|%s"%(self.name,self.code) #与JS代码中的格式要求一致即可
9     full_name = property(_get_full_name)

view.py

01 # -*- coding: UTF-8 -*-
02 from learn.school.models import Products
03 from django.http import HttpResponse
04 from django.db.models import Q
05  
06 def tag_autocomplete(request):
07     if request.GET.has_key('q'):
08         q_str = request.GET['q']
09         if len(q_str)>0#定义输入多少字符后开始查询
10             tags = (Students.objects.filter(Q (name__icontains=request.GET['q']) | Q (age__icontains=request.GET['q'])))[:10]#导入高级查询模式Q 进行逻辑或查询,此处查询结果数最好与JS代码中的限制一致,避免多余开销
11             return HttpResponse('\n'.join(tag.full_name for tag in tags)) #使用了模型中自定义的属性 full_name
12     return HttpResponse()
然后在urls,py中配置好你的 /search/ 指向到 view.py 中的 tag_autocomplete即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
插件使用配置(config)还是很灵活的,当然也是弊端,配置不当,效果就没了。 使用时候,重要的参数如下(此demo参数配置点击右键看源码): url: 'http://suggest.taobao.com/sug?code=utf-8&extras=1', queryName: 'q', //url?queryName=value,默认为输入框的name属性 jsonp: 'callback', //设置此参数名,将开启jsonp跨域功能(我要调淘宝数据,非跨域不可,淘宝的回调参数名就是callback),否则使用json数据结构 item: 'li', //下拉提示项目单位的选择器,默认一个li是一条提示,与processData写法相关。 processData: function(data){ }//自定义处理返回的数据,该方法可以return一个html字符串或jquery对象,将被写入到提示的下拉层中。 右键查看源码,将看到本demo所编写的processData函数是怎样的,所以这个参数是把如何表现交给你来做了,但别忘了配合 item 参数 getCurrItemValue: function($currItem){ }//定义如何去取得当前提示项目的值并返回值,插件根据此函数获取当前提示项目的值,并填入input中,此方法应根据processData参数来定义。 是的,如果你自定义了processData,这个参数恐怕也需要自定义,默认是获取$currItem.html(),你也可以return $currItem.attr('an attrName'); 右键查看源码,将看到本demo所编写的getCurrItemValue函数是怎样的 textchange: function($input){}, //不同于change事件在失去焦点触发,inchange依赖本插件,只要内容有变化,就会触发,并传入input对象 onselect: function($currItem){} //当选择了下拉的当前项目时执行,并传入当前项目。比如选择了某个提示项目,就提交表单。 sequential: 0, //按着方向键不动是否可以持续选择,默认不可以,设置值可以是任何等价的boolean

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值