2016-11-30 43 views
1

我有一個顯示用戶所在國家和州/省/地區的Django窗體。在這種形式下,我使用我預先填充的Select窗口小部件以ChoiceField的形式顯示所有國家/地區,名稱爲'country'一個列表。如果用戶居住在美國或加拿大,我會創建另一個名爲'region'的ChoiceField,它也使用Select小部件,並使用美國州或加拿大省的列表預先填充。這些字段的表單標籤分別是「州」或「省」。如果用戶來自其他國家,我使用TextInput小部件將區域字段表示爲CharField,並允許他們在此字段中可選地輸入區域名稱。其標籤是「州/省/地區」。當用戶第一次訪問此頁面時,我知道他們所在的國家,因此我適當地預先填充了國家和地區字段。這是我的要求,但我不知道如何在Django中實現它們。如何重新生成Django ChoiceField帶外如果另一個ChoiceField更改?

  1. 如果用戶是在美國和改變了國家下拉到加拿大,我想去「出帶外」回服務器,獲取加拿大的地區名單,並重新填充區域拉下這些地區。我也想將標籤從「州」改爲「省」。我不想刷新頁面。
  2. 如果在加拿大的用戶切換到美國,我會做同樣的事情,但相反。
  3. 如果用戶在美國或加拿大並將該縣更改爲任何其他國家,我只想將表單控件從ChoiceField更改爲CharField,而無需進行頁面刷新。
  4. 如果用戶位於美國或加拿大以外的任何國家並選擇這兩個國家中的任意一個,我想做相反的操作並將區域從CharField更改爲ChoiceField,同樣不需要刷新頁面。
  5. 最後,我希望該技術具有可擴展性,這意味着當我開始跟蹤另一個國家(如墨西哥)的區域時,修改代碼並不會太困難。

這裏是我的文件:

# models.py 
class Profile(models.Model): 
    region = models.CharField(max_length=30, null=True, blank=True) 
    country = models.ForeignKey('Country') 

# forms.py 
class BusinessProfileForm(forms.Form): 
    country = forms.ChoiceField(
     choices = COUNTRIES, 
     widget = forms.Select()) 

class USBusinessProfileForm(BusinessProfileForm): 
    region = forms.ChoiceField(
     choices = US_STATES, 
     widget = forms.Select()) 

class CABusinessProfileForm(BusinessProfileForm): 
    region = forms.ChoiceField(
     choices = CA_PROVINCES, 
     widget = forms.Select()) 

class OtherBusinessProfileForm(BusinessProfileForm): 
    region = forms.CharField(
     required = False, 
     widget = forms.TextInput()) 

# choices.py 
COUNTRIES = [ 
    ('US', _('United States')), 
    ('GB', _('United Kingdom')), 
    ('CA', _('Canada')), 
    ...] 
US_STATES = [ 
    ('AL', _('Alabama')), 
    ('AK', _('Alaska')), 
    ...] 
CA_PROVINCES = [ 
    ('AB', _('Alberta')), 
    ('BC', _('British Columbia')), 
    ...] 

誰能幫助我瞭解如何在Django解決這個問題?我不知道如何圍繞它來包裹我的頭。看起來很複雜。只是大聲思考,似乎我不得不爲國家控制分配某種點擊事件。當它啓動時,我讀取選定的新國家,如果它是我追蹤的地區之一,請將帶外請求發送回服務器上的某個「東西」,以返回適當的列表。然後,我會用列表重新填充控件並更改控件的標籤。如果國家不是我跟蹤的區域,我將該控件重新創建爲CharField並更改標籤。如果用戶從一個國家切換,我不跟蹤另一個國家(例如從墨西哥到哥斯達黎加),我什麼都不做。

回答

0

你不會在純Django中解決這個問題,因爲Django是一個服務器應用程序,並且需要一些客戶端代碼來實現你想要的。

幸運的是,你的目標很常見,所以有很多教程展示瞭如何做你想做的。 Here is an example(忽略PHP部分)。如果你對jQuery,AngularJS等客戶端庫/框架甚至Javascript本身一無所知,那麼這是一個很好的開始的方法。