1

我有一个模型,其位置字段映射到 city_light.city,我正在使用一个自动完成字段,允许用户输入他们的城市并将其自动完成到正确/有效的位置模型实例。

class Profile(models.Model):
    location = models.ForeignKey(City, blank=True, null=True)

class ProfileForm(ModelForm):

    class Meta:
        model = Profile
        fields = ('location')
        widgets = {
            'location': autocomplete_light.TextWidget(CityAutocomplete, autocomplete_js_attributes={'placeholder':'City, Country', 'minimum_characters':4})
        }

表单字段的工作方式与宣传的完全一样,并显示了自动完成选项列表。但是,当我保存表单/模型时,我收到一个验证错误,这似乎是由于字段未转换为 City 模型实例的主键引起的。

Select a valid choice. That choice is not one of the available choices.

我猜我需要像下面实现的 CityAutocomplete 一样扩展 AutocompleteModelBase,但我不确定如何并且我一直无法找到一个工作示例。

class CityAutocomplete(autocomplete_light.AutocompleteModelBase):
    search_fields = ('search_names',)

https://github.com/yourlabs/django-cities-light/blob/master/cities_light/contrib/autocompletes.py

感谢您的帮助,如果我的问题格式不正确,我很抱歉。

4

1 回答 1

3

您的问题并非特定于 django-autocomplete-light。你正在做的事情没有机会工作,原因如下:

结果,使用文本小部件选择几个城市,如“里斯本”和“马德里”,将如下所示:

<input type="text" value="Lisboa, Madrid" name="location" />

这意味着表单将发布{'location': 'Lisboa, Madrid'}。虽然这对 a 有好处CharField,但它不适用于 a ,ModelMultipleChoiceField它会期望像{'location': [3,5]}3 是 Lisboa 的 pk 和 5 是马德里的 pk 的地方。

以同样的方式,aModelChoiceField会期望{'location': 3}autocomplete_light.ChoiceWidget能够做到。

要解决此问题,请使用 aChoiceWidget而不是 a TextWidget。我已经在教程中澄清了这一点,我希望现在更好。

于 2013-04-11T17:36:22.163 回答