我正在使用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关系。你知道我做错了吗?
答案 0 :(得分:1)
使用save_m2m()
。来自the docs:
当您的模型与另一个模型具有多对多关系时,可以看到使用
commit=False
的另一个副作用。如果模型具有多对多关系,并且在保存表单时指定commit=False
,则Django无法立即保存多对多关系的表单数据。这是因为在实例存在于数据库中之前,无法为实例保存多对多数据。要解决此问题,每次使用
commit=False
保存表单时,Django都会向save_m2m()
子类添加ModelForm
方法。手动保存表单生成的实例后,可以调用save_m2m()
来保存多对多表单数据。