多对多动态删除列表关系

时间:2019-01-15 13:47:13

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

我有2个表“ Client”和“ Location”。

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()

到目前为止,我只能将位置字段设为空白。不知道下一步该怎么做,因为我所看到的例子并不完全像我的。

1 个答案:

答案 0 :(得分:0)

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

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

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