2013-04-10 61 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