如果另一个ChoiceField更改,如何重新填充Django ChoiceField带外?

时间:2016-11-30 18:50:44

标签: jquery ajax django django-models django-forms

我有一个Django表单,显示用户所在的国家/地区/州/省/地区。在此表单中,我以ChoiceField形式显示所有国家/地区' country'使用我从列表中预先填充的Select小部件。如果用户居住在美国或加拿大,我将创建另一种形式ChoiceField,名为“' region'它也使用Select小部件,我使用美国州或加拿大省份列表预先填充。这些字段中任何一个的表单标签是" State"或"省"分别。如果用户来自任何其他国家/地区,我使用TextInput小部件将区域字段表示为CharField,并允许他们在此字段中输入区域名称。它的标签是"州/省/地区"。当用户第一次访问此页面时,我知道他们所在的国家/地区,因此我会适当地预填充国家和地区字段。这是我的要求,但我不确定如何在Django中实现它们。

  1. 如果用户在美国并将国家/地区下拉更改为加拿大,我希望去“带外”"返回服务器,获取加拿大地区的列表,并重新填充这些地区的地区下拉。我也想改变#34; State"的标签。到"省"。我不想刷新页面。
  2. 如果加拿大的用户切换到美国,我会做同样的事情,但反过来。
  3. 如果用户在美国或加拿大并将该县更改为任何其他国家/地区,我只想将表单控件从ChoiceField更改为CharField而无需进行页面刷新。
  4. 如果用户位于美国或加拿大以外的任何国家/地区并选择这两个国家/地区中的任何一个,我想反过来并将区域从CharField更改为ChoiceField,同样没有页面刷新
  5. 最后,我希望这项技术具有可扩展性,这意味着当我开始跟踪墨西哥等其他国家/地区的区域时,修改代码并不会太难。
  6. 以下是我的文件:

    # 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并更改标签。如果用户从一个国家/地区切换到另一个我不跟踪的国家(例如从墨西哥到哥斯达黎加),我什么都不做。

1 个答案:

答案 0 :(得分:0)

你不会在纯Django中解决这个问题,因为Django是一个服务器应用程序,需要一些客户端代码来实现你想要的。

幸运的是,你的目标相当普遍,因此有很多教程展示了如何做你想做的事情。 Here is an example(忽略PHP部分)。如果您对jQuery,AngularJS等客户端库/框架一无所知,甚至不了解Javascript本身,那么这是一个让您入门的好方法。