如何使用 django-autocomplete-light

How to use django-autocomplete-light

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

到目前为止我做了以下事情:

安装django_autocomplete_light

更改了 INSTALLED_APPS:

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

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

来自 django.conf.urls 导入包含,url 来自 django.contrib 导入管理员

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 到 运行 应用程序。

编辑:

我将 url 模式更改为(首先制作 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")),
]

虽然这并没有解决问题。

如果您使用 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"),
        }

您应该注意,将出现在自动完成中的将是您在模型 class 中 __str____unicode__ 函数中 return 的内容。在我的示例中,我的 Persons class 具有以下 __unicode__ 方法:

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

因此,自动完成的文本字段中显示的将是此人的全名,而不仅仅是名字,如果您 select 将在该字段中输入全名。

根据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 中,与您的代码有很大不同。