【问题标题】:How to Repopulate Django ChoiceField Out-of-Band If Another ChoiceField Changes?如果另一个 ChoiceField 发生变化,如何在带外重新填充 Django ChoiceField?
【发布时间】:2017-04-15 05:25:47
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-11
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 2019-09-29
      • 1970-01-01
      • 2021-11-17
      • 2019-07-20
      相关资源
      最近更新 更多