【发布时间】:2017-04-15 05:25:47
【问题描述】:
我有一个 Django 表单,它显示用户居住的国家和州/省/地区。在此表单中,我使用预先填充的 Select 小部件在名为“country”的表单 ChoiceField 中显示所有国家/地区从列表中。如果用户居住在美国或加拿大,我将创建另一个名为“region”的表单 ChoiceField,该表单也使用 Select 小部件,并且我使用美国州或加拿大省的列表预先填充该表单。这些字段中的任何一个的表单标签分别是“州”或“省”。如果用户来自任何其他国家/地区,我将使用 TextInput 小部件将区域字段表示为 CharField,并允许他们选择在此字段中输入区域名称。它的标签是“州/省/地区”。当用户第一次访问此页面时,我知道他们所在的国家/地区,因此我适当地预先填充了国家和地区字段。这是我的要求,但我不确定如何在 Django 中实现它们。
- 如果用户在美国并将国家/地区下拉菜单更改为加拿大,我想“带外”返回服务器,获取加拿大地区列表,然后使用这些地区重新填充地区下拉菜单地区。我还想将标签从“州”更改为“省”。我不想刷新页面。
- 如果用户在加拿大并切换到美国,我会做同样的事情,但反过来。
- 如果用户在美国或加拿大并将县更改为任何其他国家/地区,我只想将表单控件从 ChoiceField 更改为 CharField,而无需刷新页面。
- 如果用户位于美国或加拿大以外的任何国家/地区并选择这两个国家/地区中的任何一个,我想执行相反的操作并将区域从 CharField 更改为 ChoiceField,同样无需刷新页面。
- 最后,我希望该技术具有可扩展性,这意味着当我开始跟踪另一个国家/地区(例如墨西哥)的区域时,修改代码不会太困难。
这是我的文件:
# 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