7

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

到目前为止,我已经完成了以下工作:

安装 django_autocomplete_light

更改了 INSTALLED_APPS:

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

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

from django.conf.urls import include, url from 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")),
]

但这并没有解决问题。

4

2 回答 2

4

如果您使用django-autocomplete-lightto search ,则必须做一些不同的事情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"),
        }

您应该注意,出现在 autcomplete 中的内容将是您在模型类的__str__or__unicode__函数中返回的内容。在我的示例中,我的 Persons 类具有以下__unicode__方法:

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

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

于 2015-07-29T22:04:02.560 回答
0

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

//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 中,并且与您的代码非常不同。

于 2017-05-31T06:52:58.557 回答