Python Django自动完成灯和城市灯-无效选择
我有一个带有位置字段的模型,该字段映射到cities\u light.city,我正在使用一个自动完成字段,允许用户键入他们的城市,并将其自动完成到正确/有效的位置模型实例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
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
中模型的PK值,默认情况下,ModelChoiceField.queryset
Model.objects.all()
widgetTextWidget
- 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,我会修复它,否则我会告诉你问题是什么;)