来自 db 的 Django 自动完成

Posted

技术标签:

【中文标题】来自 db 的 Django 自动完成【英文标题】:Django autocomplete from db 【发布时间】:2014-10-14 06:52:51 【问题描述】:

我有一个这样的模型:

class Baslik(models.Model):
    user = models.ForeignKey(User, null=True, blank=True)
    title = models.CharField(max_length=50)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)
    active = models.BooleanField(default=True)

我想根据这个模型的标题字段自动完成模板中的输入。我只想自动完成标题,其他任何东西都不适合我吗?我认为应该使用 jquery、ajax 等来完成。我对它们一无所知。 有没有办法做到这一点?有没有完全相同的包? 谢谢。

【问题讨论】:

你能澄清一下吗? 我在模板中有一个输入,我想在用户开始输入时自动完成标题。 【参考方案1】:

我使用 bootstrap 的 typeahead 插件,它的 Bloodhound 引擎让您可以使用远程资源。 文档和示例here.

您必须编写一个 JSON 响应视图来处理由 typeahead 发出的请求

js 代码所需的编辑: 您可以使用以下内容:

var source = new Bloodhound(
    hint: false,
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('description'),
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: YOUR_JSON_VIEW_URL + '&query=%QUERY'
    );

    source.initialize();

这将初始化指向您的 JSON 视图的源。请注意,无论用户输入什么类型,Bloodhound 都会填充 %QUERY 参数。

之后,我们需要告诉 typeahead 使用这个来源:

$(typeahead_input).typeahead(null, 
        name: 'some_name',
        displayKey: 'description',
        source: source.ttAdapter() 

注意我指定的 displayKey,这是 typeahead 显示的属性,现在,在视图上:

我们会有类似的东西:

from django.views.generic import View

class MyJsonView(View):

    def get(self, request):
        context = []
        querystring = request.GET.get('query', None)
        if querystring:
            instances = MyModel.objets.filter(somefield__icontains=querystring)
            for ins in instances:
                 context.append('id': ins.id, 'description' ins.display_field)
        json_context = json.dumps(context)
        return HttpResponse(json_context, 'content_type': 'application/json')

【讨论】:

我不明白应该更改 js 代码的哪一部分。我对 js 很陌生。能不能说的详细点? 我应该把class MyJsonView(View): 和它的延续放在哪里? 在您的应用程序中的 views.py 文件中。您必须将 YOUR_JSON_VIEW_URL 的 url conf 指向此视图 让我明白这一点,我应该将第一个和第二个代码部分放在我想使用搜索的 base.html 中,在不同的 这是一些基本的django知识!添加类似: url(r'^search_my_model/$', MyJsonView.as_view(), name='search_my_model')【参考方案2】:

ui-autocomplete-input 非常适合这个。

在模板中生成列表

<script>
$(function() 
var availableTitles = [
   % for baslik in basliks %
      " baslik.title" % if not forloop.last %,% endfor %   
   % endfor %

];
$( "#tags" ).autocomplete(
  source: availableTitles
);
);
</script>

<div class="ui-widget">
  <label for="tags">Tags: </label>
  <input id="tags">
</div>

EDIT(基于 cmets):添加了 json 响应;这在 ui-autocomplete 和 bootstrap/typeahead.js 解决方案中都是需要的

import json

from django.http import HttpResponse

def json_response_view(request):
   q = request.GET.get('q', '')
   response_data = Baslik.objects.filter(title__startswith=q).values("title")
   return HttpResponse(json.dumps(response_data), content_type="application/json")

【讨论】:

我将拥有一个巨大的数据库。这对巨大的数据库来说不是很糟糕吗?另外,有没有机会用那个开头的? 对大数据库来说真的很糟糕;) 在这种情况下,您可能希望查看同一站点上的远程 JSON 数据源:jqueryui.com/autocomplete/#remote,并在您的 Django 项目中生成一个视图,该视图会生成一个带有标题的 json 页面 我推荐使用boostrap而不是过时的jquery ui 有机会使用我自己的搜索视图吗?我有这个代码:try: q = request.GET.get('q', '') except: q = False baslik_queryset = Baslik.objects.filter( Q(title__startswith=q) )我如何使用这个代码在输入下同时搜索和显示结果以进行自动完成?

以上是关于来自 db 的 Django 自动完成的主要内容,如果未能解决你的问题,请参考以下文章

Jquery自动完成不过滤来自django的JSON数据

当源是来自 Django 的字典时,使用预取 + 远程的 Typeahead Bloodhound 自动完成

YII2如何将查询结果发送到jquery自动完成?

在Django中的文本字段上禁用自动完成?

带有自动完成功能的简单 Django 表单

Django:具有多个查询集的 jQuery 自动完成