只将单个元素保存到ManyToManyField中



我有一个应用程序,它有一个Meet,这个Meet可以只有一个客人,也可以有多个客人。我定义了Meet模型,其中包含与User的ManyToManyField关系,以及一个字段,以便选择会议是与单个客人还是在一个团队中(与许多客人(,如下所示:

class Meet(IndexedTimeStampedModel):
kind_meet = models.CharField(max_length=50,
choices=MEET_CHOICES)
guests = models.ManyToManyField(User, related_name='guests')

我用Meet Model做了一个表格,所以首先用户选择他想做的会议类型,然后在下一页上选择会议的一位或多位客人。

我的问题是,如果用户选择了一次会面,我怎么能强迫他在模板的选择框中只选择一位客人?

在我的ModelForm中,我试图限制将guests字段的小部件定义为Select,但ManyToManyField只接受一个值列表,Select将值作为字符串而不是列表返回。这会导致错误

"输入一个值列表";

当我提交表单时。我的第二次尝试是将小部件更改为SelectMultiple,但这允许用户选择更多的访客。

class Meta:
model = Meet
widgets = {
'guests': forms.Select(attrs={'class': 'form-control'})
}

有人知道如何强制用户在m2m关系中只选择一个guest(值(吗?

您可以在表单提交后继续使用Select小部件和视图,并将提交转换为具有以下内容的列表:

# copy from immutable QueryDict
data = {**request.POST}
# change your data from the guest input to be a list
data["guests"] = [data.pop("guests", [])]
form = MeetForm(data=data)
if form.is_valid():
. . .

最新更新