如何使用 django-autocomplete-light
Posted
技术标签:
【中文标题】如何使用 django-autocomplete-light【英文标题】:How to use django-autocomplete-light 【发布时间】:2015-10-15 12:37:28 【问题描述】:如何使用 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
运行应用程序。
编辑:
我将 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")),
]
但这并没有解决问题。
【问题讨论】:
【参考方案1】:根据this教程,我认为你的代码没有意义。
您需要 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,并且与您的代码非常不同。
【讨论】:
我在教程中没有看到任何地方明确指出:“您需要一个外键或与另一个模型的多对多关系(不仅仅是您的示例中的一个)来自动完成表单字段。”【参考方案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)
因此,正在自动完成的文本字段中显示的将是该人的全名,而不仅仅是名字,如果您选择一个,则全名将输入到该字段中。
【讨论】:
这似乎不适用于 dal 3.x。有什么解决办法吗?以上是关于如何使用 django-autocomplete-light的主要内容,如果未能解决你的问题,请参考以下文章
Django - django-autocomplete-light 设置如何