【问题标题】:Dynamic Drop List for Many to Many relation多对多关系的动态下拉列表
【发布时间】:2025-12-27 14:30:17
【问题描述】:

我有 2 个表“客户”和“位置”。

class Client(models.Model):
    name = models.CharField(max_length=50)

class Location(models.Model):
    name = models.CharField(max_length=50)

一个客户可以在多个位置,一个位置可以有多个客户。

我创建了第三个表来保存这种关系:

class Client_Location(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    location = models.ForeignKey(Location, on_delete=models.CASCADE)

我创建了一个表单来测试我是否可以使下拉列表动态化,所以如果我要选择一个客户,任何链接到该客户的位置都只会出现。

class ClientLocationForm(forms.ModelForm):
    class Meta:
        model = Client_Location
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['location'].queryset = Location.objects.none()

到目前为止,我只能将位置字段设为空白。不知道下一步该去哪里,因为我看到的例子和我的不完全一样。

【问题讨论】:

  • 一般来说,我建议使用models.ManyToManyField,这样我们就可以轻松实现。以及其他可以通过 ajax 管理的事情
  • 那么我会使用 client = models.ManyToManyField(Location) 吗?我以前没有使用过ajax,我该怎么做呢? @AnupYadav

标签: django drop-down-menu dynamic-data-list


【解决方案1】:

只需对代码进行少量更改,您就可以将现有的 Client_Location 模型添加为 through 模型,以建立新的显式 ManyToMany 关系。为此,请将以下字段添加到您的 Client 模型中:

 locations = models.ManyToManyField('Location', through='Client_Location', related_name='clients')

如果您需要完全动态更新,您需要编写一个视图,该视图提供指定客户端 (client.locations.all()) 的位置列表,然后将它们显示在您的页面上。

【讨论】:

  • 仅此一项会使下拉列表动态化吗?我所有的位置都存储在 postgresql 的一个表中
  • @Lloyd,要使下拉列表动态化(当您在页面上选择客户端时,所有位置都会在不重新加载页面的情况下加载),您确实需要在您的站点上编写 Ajax 脚本,这会请求返回的视图需要的位置。
  • 你能告诉我 ajax 代码的样子吗?
  • @Lloyd,这是一个完全不同的问题 :)