2013-04-10 63 views
1

我有一个模型,其中有一个映射到cities_light.city的位置字段,我使用了一个自动填充字段,允许用户键入他们的城市并使其自动完成正确/有效位置模型实例。Django autocomplete_light和cities_light - 无效的选择

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

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

+1

'fields =('location')'应该是'fields =('location',)'或'fields = ['location']'。要检查字段是否正确翻译,请检查隐藏的select元素。另外,有什么方法可以重现test_project中的错误? – jpic 2013-04-10 22:36:58

+0

我看不到任何隐藏的选择元素。我正在使用autocomplete.TextWidget而不是选择字段。但是我确实看到我想要的实际值是自动完成元素的数据值。发送城市的字符串名称而不是id。领域变化没有区别。我会看看test_project,谢谢。 – Z99 2013-04-11 14:01:20

+0

哦,我也用django 1。5我忘了提及。 – Z99 2013-04-11 14:12:59

回答

3

你的问题不是特定于django-autocomplete-light。你在做什么有没有机会去工作,这里的原因:

结果,选择一对夫妇像“葡京”和“马德里”城市与文本控件看起来像::

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

这意味着表单将发布{'location': 'Lisboa, Madrid'}。虽然这对CharField有好处,但它不适用于ModelMultipleChoiceField,它可能会预计像{'location': [3,5]}这样的3将是葡京的pk和5马德里的pk。

以同样的方式,ModelChoiceField预计{'location': 3}其中autocomplete_light.ChoiceWidget能够做到。

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

+0

你是对的。仔细查看test_project中的示例后,我稍微更改了实现,以反映generic_inline应用程序的实现,因为我希望人们能够输入位置。这也意味着如果用户想要更多的隐私,用户现在可以概括他们的位置(即国家或地区而不是城市)。也许值得注意的是,直到我从ModelForm更改为autocomplete_light.GenericModelForm,该字段才显示预设位置。也许我会为您的test_project提交一个示例应用程序。非常感谢您的时间和帮助。 – Z99 2013-04-11 18:48:10

+1

干得好!通用外键是一个高级主题;) – jpic 2013-04-11 18:53:50

+0

是的,我对python和django也很陌生。我注意到的唯一的事情是,在显示具有设置位置的表单时,有两个关闭图标的跨度。 – Z99 2013-04-11 19:45:53