如何根据所选“国家”更新“城市”下拉菜单?
我该怎么做才能根据选择的“国家”来更新“城市”的下拉菜单?在Django中有没有什么现成的工具可以帮助我实现这个功能?
class Country(models.Model):
name = models.CharField(max_length=50)
...
class City(models.Model):
name = models.CharField(max_length=50)
country = models.ForeignKey(Country)
class UserProfile(models.Model):
...
country = models.ForeignKey(Country, default=1)
city = models.ForeignKey(City, default=1)
user = models.OneToOneField(User)
在我的视图中,我有:
{{ profile_form.country }}
{{ profile_form.city }}
但是所有的城市都一次性显示出来了。
请给点建议。
3 个回答
1
这听起来像是你想在用户的电脑上用JavaScript来做的事情。你的网页服务器(运行Django的机器)不知道用户什么时候在下拉菜单中做了选择,直到他们点击提交按钮。(这时会向你的网页服务器发送一个HTTP POST请求,把表单中的所有参数传过去)。
在JavaScript中,你可以注册一个函数,这样当用户改变“国家”下拉菜单时,“城市”下拉菜单就会动态更新。
希望这对你有帮助!
2
可以使用 django-smart-selects 这个工具。它提供了用来更新表单字段的JavaScript功能,能帮我省下很多写ajax调用的时间。这个示例项目里有个用法跟你提到的情况很相似。对你来说,可能看起来会像这样:
from smart_selects.db_fields import ChainedForeignKey
class City(models.Model):
name = models.CharField(max_length=50)
country = models.ForeignKey(Country)
class UserProfile(models.Model):
country = models.ForeignKey(Country)
city = ChainedForeignKey(City, chained_field="country", chained_model_field="country")
根据文档的说明:
链式字段是指在同一个模型中,应该与之关联的字段。链式模型字段是指与链式字段关联的模型中的字段。
2
我的回答可能会有点长,所以我建议你可以看看这个 实现,它正好能解决你想要的问题。