2016-11-30 44 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本身一无所知,那么这是一个很好的开始的方法。