Python Django自动完成灯和城市灯-无效选择

Python Django自动完成灯和城市灯-无效选择,python,django,django-autocomplete-light,Python,Django,Django Autocomplete Light,我有一个带有位置字段的模型,该字段映射到cities\u light.city,我正在使用一个自动完成字段,允许用户键入他们的城市,并将其自动完成到正确/有效的位置模型实例 class Profile(models.Model): location = models.ForeignKey(City, blank=True, null=True) class ProfileForm(ModelForm): class Meta: model = Profile

我有一个带有位置字段的模型,该字段映射到cities\u 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})
        }
Select a valid choice. That choice is not one of the available choices.
表单字段的工作方式与广告完全相同,并显示自动完成选项列表。然而,当我保存表单/模型时,我得到了一个验证错误,这似乎是由于该字段没有被转换为城市模型实例的主键引起的

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})
        }
Select a valid choice. That choice is not one of the available choices.
我猜我需要像下面实现的CityAutocomplete那样扩展AutoComplete模型库,但我不确定如何扩展,我一直无法找到一个工作示例

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


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

您的问题不是django autocomplete light所特有的。你正在做的事情没有机会工作,原因如下:

  • 默认情况下,与
    位置
    类似的
    外键
    的表单字段为
  • ModelChoiceField
    接受
    ModelChoiceField.queryset
    中模型的PK值,默认情况下,
    Model.objects.all()
  • TextWidget
    widget
  • a,
  • 的值在表单提交时直接发送到服务器
因此,使用文本小部件选择“里斯本”和“马德里”这样的两个城市如下所示:

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

这意味着表单将发布
{'location':'Lisboa,Madrid'}
。虽然这对
CharField
很好,但对
modelmultipechoicefield
不起作用,因为它期望类似
{'location':[3,5]}
的东西,其中3是里斯本的pk,5是马德里的pk

以同样的方式,
modelcooicefield
将期望
{'location':3}
这是
autocomplete\u light.ChoiceWidget
能够做到的


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

字段=('location')
应该是
字段=('location',)
字段=['location']
。要检查字段是否正确转换,请检查隐藏的select元素。还有,有没有办法在test_项目中重现这个bug?我没有看到任何隐藏的select元素。我使用的是autocomplete.TextWidget,而不是select字段。但我确实看到了我想要的实际值是自动完成元素的数据值。发送的是城市的字符串名称,而不是id。字段更改没有任何区别。我将看一看test_项目,谢谢。哦,我还使用了django 1.5,我忘了提到。顺便说一下,我还使用test_项目中的简化示例进行了测试,它与选项选择小部件配合使用效果很好,但是有数千个城市,这就是为什么我想使用文本字段的原因。感谢您的帮助,我仍在查看测试项目。您是对的。在查看了test_项目中的示例之后,我稍微改变了我的实现,以反映通用_内联应用程序的实现,因为我希望人们能够在某个位置键入内容。这也意味着如果用户想要更多的隐私,他们现在可以概括他们的位置(即国家或地区而不是城市)。还值得注意的是,在我从ModelForm更改为autocomplete_light.GenericModelForm之前,该字段没有显示预设位置。也许我会为你的测试项目提交一个示例应用程序。非常感谢您的时间和帮助。干得好!通用外键是一个相当高级的主题;)是的,我对python和django也很陌生。我注意到的唯一一件事是,当显示具有设置位置的窗体时,有两个带有闭合图标的跨距。我不明白。。。这看起来像虫子吗?在test_项目中它是可复制的吗?如果你能告诉我如何复制这个问题,这样我就可以自己看到,如果它是一个bug,我会修复它,否则我会告诉你问题是什么;)