如何使用django-autocomplete-light

时间:2015-07-24 18:23:18

标签: jquery python django autocomplete django-autocomplete-light

如何使用django_autcomplete_light将自动填充功能添加到表单中的一个字段。我有一个基于模型的表单,我想在firstname字段中添加自动完成功能。

到目前为止,我已完成以下操作:

安装django_autocomplete_light

更改了INSTALLED_APPS:

INSTALLED_APPS = (
  'autocomplete_light',
  'django.contrib.admin',
   ...

将其添加到urls.py,这是我的urls.py:

来自django.conf.urls import include,url 来自django.contrib import admin

urlpatterns = [
    url(r"^admin/", include(admin.site.urls)),
    url(r"^app/", include("app.urls")),
    url(r"^autocomplete/", include("autocomplete_light.urls")),
    url(r"^.*$", include("app.urls")),
]

创建了一个名为autocomplete_light_registry.py的文件,并添加了以下内容:

import autocomplete_light as al
from .models import *

al.register(Person,
    search_fields = ["^firstname"],
    attrs={
        "placeholder":"First name",
        "data-autocomplete-minimum-characters":1,
    },
    widget_attrs={
        "data-widget-maximum-values":4,
        "class":"modern-style",
    },
)

改变了我的PersonForm:

class PersonForm(forms.ModelForm)

为:

class PersonForm(autocomplete_light.ModelForm)

    class Meta:
        model = Person
        autocomplete_fields = ("firstname")

我还将以下行添加到表单的html页面中:

{% include 'autocomplete_light/static.html' %}

我导入了所有必要的jquery文件

但是自动完成功能不会出现。我没有收到任何错误。我按照文档教程。

我正在使用python manage.py runserver来运行该应用程序。

修改

我将urlpatterns更改为(先制作django-autocomplete-light url):

urlpatterns = [
    url(r"^autocomplete/", include("autocomplete_light.urls")),
    url(r"^admin/", include(admin.site.urls)),
    url(r"^app/", include("app.urls")),
    url(r"^.*$", include("app.urls")),
]

但这并没有解决问题。

2 个答案:

答案 0 :(得分:2)

如果您使用django-autocomplete-light搜索models.CharField,则必须执行其他操作。在form.py中,您需要将以下小部件添加到要添加自动完成功能的字段中:

autocomplete_light.TextWidget("PersonAutocomplete")

例如forms.py:

from django import forms
import autocomplete_light
from .models import *

class PersonForm(forms.ModelForm):
    """
    This form is to create new RTN's.  It does not include lastupdateddate and
    lastupdatedby, because these will be automatically filled out.
    """
    class Meta:
        model = Rtn
        autocomplete_fields = ("firstname")
        fields = ["firstname", "lastname", "age"]
        widgets = {
           "firstname":autocomplete_light.TextWidget("PersonAutocomplete"),
        }

您应该注意,自动填充中显示的内容将是您在模型类中的__str____unicode__函数中返回的内容。在我的示例中,我的Persons类具有以下__unicode__方法:

def __unicode__(self):
  return "{0} {1}".format(self.firstname, self.lastname)

因此,正在自动完成的文本字段中显示的内容将是该人员的全名,而不仅仅是名字,如果您选择其中一个,则会在该字段中输入全名。

答案 1 :(得分:0)

根据this教程,我认为您的代码没有意义。 您需要与另一个模型(不仅仅是示例中的一个)建立foreign keymany-to-many关系才能自动填写表单字段。 在教程示例中,birth_countryPersonForm中自动完成,如下所示:

//forms.py

class PersonForm(forms.ModelForm):
class Meta:
    model = Person
    fields = ('__all__')
    widgets = {
        'birth_country': autocomplete.ModelSelect2(url='country-autocomplete')
    }

表单代表所有Person字段,并覆盖birth_country自动填充。

此外,请注意dal插件已经在版本3中,与您的代码非常不同。