【问题标题】:How to use django-autocomplete-light如何使用 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")),
]

但这并没有解决问题。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我在教程中没有看到任何地方明确指出:“您需要一个外键或与另一个模型的多对多关系(不仅仅是您的示例中的一个)来自动完成表单字段。”
    【解决方案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。有什么解决办法吗?
    猜你喜欢
    • 2017-03-26
    • 2018-05-31
    • 2018-09-20
    • 1970-01-01
    • 2015-12-07
    • 2013-01-06
    • 2018-06-13
    • 2016-03-29
    • 2017-04-01
    相关资源
    最近更新 更多