我有一个带有位置字段的模型,该字段映射到cities_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.
我猜我需要扩展AutocompleteModelBase,就像下面实现的CityAutocomplete一样,但我不确定如何,我一直无法找到一个有效的例子。
class CityAutocomplete(autocomplete_light.AutocompleteModelBase):
search_fields = ('search_names',)
https://github.com/yourlabs/django-cities-light/blob/master/cities_light/contrib/autocompletes.py
感谢任何帮助,如果我的问题格式不正确,我很抱歉。
答案 0 :(得分:3)
您的问题并非特定于django-autocomplete-light。你正在做什么没有机会工作,这就是原因:
ForeignKey
location
的表单字段为ModelChoiceField,ModelChoiceField
接受ModelChoiceField.queryset
中pks模型的值,默认为TheModel.objects.all()
,TextWidget
小部件is a TextInput
,TextInput
widget is just an <input type="text" />
,<input type="text" />
的值会在表单提交时直接发送到服务器。因此,使用文本小部件选择“Lisboa”和“Madrid”等几个城市将会显示为::
<input type="text" value="Lisboa, Madrid" name="location" />
这表示该表单将发布{'location': 'Lisboa, Madrid'}
。虽然这对CharField
有好处,但它不适用于ModelMultipleChoiceField
这样的{'location': [3,5]}
,其中3将是Lisboa的pk,5将是马德里的pk。< / p>
以同样的方式,ModelChoiceField
可以{'location': 3}
autocomplete_light.ChoiceWidget
ChoiceWidget
。
要解决此问题,请使用TextWidget
代替{{1}}。我澄清了这一点in the tutorial我希望现在好一点。