【问题标题】:Django autocomplete feature with django-ajax-selects带有 django-ajax-selects 的 Django 自动完成功能
【发布时间】:2014-06-14 14:29:30
【问题描述】:

我需要在我的 Django 项目中实现自动完成字段的帮助。 当用户在查询中键入时,我正在尝试从我的数据库中获取相关项目的列表。

我正在使用django-ajax-selects package

我的项目名称是computer builder,而buildsparts 是应用程序。 我的文件结构如下:

parts/models.py:

from django.db import models

# Create your models here.

class moboListing(models.Model):
    """This model makes a database for a list of motherboards and prices"""
    id = models.AutoField(primary_key=True)
    moboList = models.CharField(max_length=400)
    moboPrice = models.DecimalField(max_digits=5, decimal_places=2)

在数据库中,moboListing 填充了主板的名称。

builds/models.py:

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class BuildsTable(models.Model):

    moboPart   = models.CharField(max_length=400)
    moboPrice  = models.DecimalField(max_digits=5, decimal_places=2)

builds/forms.py:

from django.forms.models import ModelForm
from django import forms
from ajax_select import make_ajax_field
from parts.models import moboListing
from builds.models import BuildsTable

class BuildsForm(ModelForm):

    class Meta:
        model = moboListing

    moboList  = make_ajax_field(moboListing, 'moboList', 'moboList', help_text=None

builds/lookups.py:

from ajax_select import LookupChannel
from django.db.models import Q
from django.utils.html import escape
from parts.models import moboListing

class moboLookup(LookupChannel):

    model = moboListing

    def get_query(self, q, request):
        return moboListing.objects.filter(Q(moboList__icontains=q)).order_by('name')
    def get_result(self, obj):
        """ result is the simple text that is the completion of what the person typed """
        return obj.name
    def format_match(self, obj):
        """ (HTML) formatted item for display in the dropdown """
        return self.format_item_display(obj)

    def format_item_display(self, obj):
        """ (HTML) formatted item for displaying item in the selected deck area """
        return u"%s<div><i>%s</i></div>" % (escape(obj.moboList), escape(obj.moboPrice))

    def get_objects(self, ids):
        return moboListing.objects.filter(pk__in=ids)

builds/views.py:

from django.shortcuts import render, render_to_response
from django import forms
import datetime
from django.contrib.auth.decorators import login_required
from django.template import RequestContext

from ajax_select.fields import AutoCompleteField
from forms import BuildsForm
from builds.models import BuildsTable
from parts.models import moboListing

# Create your views here.

class SearchForm(forms.Form):

    q = AutoCompleteField(
            'moboList',
            required=True,
            help_text="Autocomplete will suggest motherboards",
            label="Motherboards",
            attrs={'size': 400}
            )

@login_required
def new_build(request):

    dd = {}
    if 'q' in request.GET:
        dd['entered'] = request.GET.get('q')
    initial = {'q': "Enter Motherboard query"}
    form = SearchForm(initial=initial)
    dd['form'] = form
    return render_to_response('new_build.html', dd, context_instance=RequestContext(request))

settings.py:

    # define the lookup channels in use on the site
    AJAX_LOOKUP_CHANNELS = {
        #simple: search Person.objects.filter(name__icontains=q)
        #'person'  : {'model': 'example.person', 'search_field': 'name'},
        # define a custom lookup channel
        #'song'   : ('example.lookups', 'SongLookup')
        #'moboList' : {'model': 'parts.moboListing', 'search_field': 'moboList'},
        'moboList': ('builds.lookups', 'moboLookup')

    }

    AJAX_SELECT_BOOTSTRAP = True

但是,在我的 html 页面上,当我在测试服务器上时,在搜索字段中输入并不会从数据库中调出任何结果: http://i.imgur.com/3o1PONH.jpg

另外,我的 html 来源显示自动完成功能已关闭,来源是 /admin/lookups/ajax_lookup/moboList,但是当我访问该链接时,我得到一个 404:

<tr><th><label for="id_q">Motherboards:</label></th><td><input type="text" name="q" id="id_q" value="Enter Motherboard query" autocomplete="off" data-ajax-select="autocomplete" data-plugin-options="{min_length: 1, initial: Enter Motherboard query, html: true, source: /admin/lookups/ajax_lookup/moboList}"  maxlength="255" 

有人可以帮我解决这个问题吗?谢谢!

【问题讨论】:

    标签: jquery python ajax django autocomplete


    【解决方案1】:

    您还需要将 ajax 查找视图添加到您的 urls.py

    from django.conf.urls.defaults import *
    
    from django.contrib import admin
    from ajax_select import urls as ajax_select_urls
    
    admin.autodiscover()
    
    urlpatterns = patterns('',
        # include the lookup urls
        (r'^autocomplete/', include(ajax_select_urls)),
    )
    

    如你所说:

    /admin/lookups/ajax_lookup/moboList,但是当我访问该链接时,我得到一个 404:

    这样应该可以立即指出问题所在。

    【讨论】:

    • 谢谢!我按照你上面所说的添加了 url,而不是文档中的 url,现在我没有得到 404 页面,我终于可以在管理面板中进行自动完成搜索。当我在管理面板中进行搜索时,我可以从终端看到输入查询时向服务器发出的请求,但是,当我在站点的前端尝试相同的操作时,似乎没有运行脚本主动搜索,我的终端没有显示对服务器的请求。我必须做一些特别的事情才能让脚本运行吗?
    • 谢谢,我让它工作了,我错过了页面上的 bootstrap.js
    • 文档中的示例假定您使用的是管理员,因此它将 url 模式放在 /admin/ 之前,以便匹配 ajax url。也许你把它放在 /admin/ include 之后,这样会吞下所有对 /admin/ 的请求我可能会更改文档示例
    猜你喜欢
    • 2011-09-29
    • 2014-09-15
    • 1970-01-01
    • 2022-10-17
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2022-01-11
    相关资源
    最近更新 更多