如何根据所选“国家”更新“城市”下拉菜单?

0 投票
3 回答
1621 浏览
提问于 2025-04-17 13:28

我该怎么做才能根据选择的“国家”来更新“城市”的下拉菜单?在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

我的回答可能会有点长,所以我建议你可以看看这个 实现,它正好能解决你想要的问题。

撰写回答