Django的Javascript自动完成功能

时间:2013-11-04 08:42:37

标签: javascript jquery python django json

我一直在尝试使用带有Django / Python数组的javascript自动完成功能,但我从来没有让它正常工作。这是我的模板脚本:

    <script>
       $(function() {
         var availableTags = "{{bandas.ba_nombre}}"
         $( "#tags" ).autocomplete({
           source: availableTags
       });
    });
    </script>

然后我有我的HTML输入框<input id="tags" />

我在一些网站上看到另一种方法是将Python数组转储到JSON中,我收到以下错误:Invalid filter: 'jsonify'

这是我用于JSON实现的Python代码:

    register = Library()

    def jsonify(object):
      if isinstance(object, QuerySet):
        return mark_safe(serialize('json', object))
      return mark_safe(simplejson.dumps(object))

    register.filter('jsonify', jsonify)
    jsonify.is_safe = True 

我的剧本:

    <script>
       $(function() {
         var availableTags = jQuery.parseJSON('{{bandas.ba_nombre|jsonify }}');
    alert(availableTags.length);
       $( "#tags" ).autocomplete({
         source: availableTags
       });
    });
    </script>

还有其他方法吗?或者我做错了什么?

2 个答案:

答案 0 :(得分:1)

我会说使用Django-autocomplete-light

一开始学习起来有点棘手,但之后有助于生成自动完成字段 https://github.com/yourlabs/django-autocomplete-light/

答案 1 :(得分:0)

我有一些使用jji UI自动完成和django的经验,并且发现两个组合存在一般问题。本质上,这是因为您无法发送部分为JSON的响应,因此您要么以正确的格式为jQuery UI返回available_tags,要么使用另一个只返回标记的函数。举两个方法的例子。

  1. 发送已在服务器端格式化的数据。这是一种蛮力的方式,不是很推荐,但可能足以满足您的需求:

    服务器端:

    available_tags = ['example', 1, 2, 'test']
    return render_to_response('mytemplate.html', {'available_tags': repr(available_tags) })
    

    客户端:

        $( "#tags" ).autocomplete({
              source: {{ availableTags }} //notice I didn't put '' around it...
           });
    
  2. 使用其他响应并动态获取:

    服务器端:

    def main(request):
        ...
        return render_to_response('mytemplate.html')
    
    def get_tags(request):
        data = {'example': 1, 'code': 2}
        return HttpResponse(json.dumps(data), content_type="application/json")
    

    客户端:

    var available_tags = $.get('get_tags/', function(data) { ...parse the json and whatnot... });
    
  3. 当然,更推荐第二种选择,但有时我也使用第一种选择。您可能需要更改它并使用它有点不同(repr可能有问题,特别是如果使用unicode等)但它是一个试错的东西,你明白了。