Django ModelForm ManyToManyField无法更新选定的值

时间:2015-06-13 21:21:55

标签: python django

我正在使用python 3.4在Django 1.8中构建我的第一个项目。我在models.py中有以下模型名为Lid:

class Lid(models.Model):
    ...
    vereniging = models.ManyToManyField(Vereniging, blank=True)

我使用以下ModelForm,forms.py

class LidForm(forms.ModelForm):

    class Meta:
        model = Lid
        exclude = []

当我使用此ModelForm创建表单来创建新对象时,会出现一个多选框,我可以选择多重Vereniging对象。这是我在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时,我只能在创建对象时设置ManyToMany关系。我无法更新这些m2m关系。你知道我做错了吗?

1 个答案:

答案 0 :(得分:1)

使用save_m2m()。来自the docs

  

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

     

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