Python Django ModelForm ManyToManyField isn';无法更新选定的值

Python Django ModelForm ManyToManyField isn';无法更新选定的值,python,django,Python,Django,我正在用Python3.4在Django 1.8中构建我的第一个项目。我在models.py中有一个名为Lid的模型: class Lid(models.Model): ... vereniging = models.ManyToManyField(Vereniging, blank=True) 我使用以下模型表单forms.py class LidForm(forms.ModelForm): class Meta: model = Lid

我正在用Python3.4在Django 1.8中构建我的第一个项目。我在models.py中有一个名为Lid的模型:

class Lid(models.Model):
    ...
    vereniging = models.ManyToManyField(Vereniging, blank=True)
我使用以下模型表单forms.py

class LidForm(forms.ModelForm):

    class Meta:
        model = Lid
        exclude = []
当我使用这个模型表单创建一个表单来创建一个新对象时,会出现一个多选择框,我可以选择多个虚拟对象。这是我在views.py中的视图:

def add_lid(request):
    if request.method == 'POST':
        form = LidForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            messages.success(request, 'Succes.')
            return HttpResponseRedirect(reverse('leden:home'))
    else:
        form = LidForm()
    return render(request, 'leden/lid/addlid.html', {'formset': form})
但是,当我想要编辑对象时,我无法更改选定的Vereniging对象

def edit_lid(request, lid_id):
    lid = get_object_or_404(Lid, pk=lid_id)
    if request.method == 'POST':
        form = LidForm(request.POST, request.FILES, instance=lid)
        if form.is_valid():
            nieuwlid = form.save(commit=False)
            nieuwlid.inschrijving_oras = lid.inschrijving_oras
            nieuwlid.save()
            messages.success(request, 'Success.')
            return HttpResponseRedirect(reverse('leden:lid', kwargs={'lid_id': lid_id}))
    else:
        form = LidForm(instance=lid)
    return render(request, 'leden/lid/editlid.html', {'formset': form, 'lid': lid})
这基本上是我的问题:当使用ModelForm时,我只能在创建对象时设置许多关系。我无法更新这些m2m关系。你知道我做错了什么吗?

使用
save\u m2m()
。发件人:

当您的模型与另一个模型存在多对多关系时,可以看到使用
commit=False
的另一个副作用。如果模型具有多对多关系,并且在保存表单时指定了
commit=False
,Django将无法立即保存多对多关系的表单数据。这是因为在数据库中存在实例之前,不可能为实例保存多对多数据

为了解决这个问题,每次使用
commit=False
保存表单时,Django都会向
ModelForm
子类添加一个
save_m2m()
方法。手动保存表单生成的实例后,可以调用
save_m2m()
保存多对多表单数据