【问题标题】:Django autocomplete from db来自 db 的 Django 自动完成
【发布时间】: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 等来完成。我对它们一无所知。 有没有办法做到这一点?有没有完全相同的包? 谢谢。

【问题讨论】:

  • 你能澄清一下吗?
  • 我在模板中有一个输入,我想在用户开始输入时自动完成标题。

标签: jquery python django autocomplete


【解决方案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) )我如何使用这个代码在输入下同时搜索和显示结果以进行自动完成?
猜你喜欢
  • 2018-07-16
  • 2017-10-08
  • 2013-02-21
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2013-08-29
  • 1970-01-01
相关资源
最近更新 更多