我的主要问题是我的代码永远不会进入for循环但是在调试器中我可以看到硬件存在。刚刚跳过for循环,我无法弄清楚为什么会这样。
型号:
class Hardware(models.Model):
name = models.CharField(max_length=30)
description = models.TextField()
class Bundle(models.Model):
name = models.CharField(max_length=30)
description = models.TextField()
devices = models.ManyToManyField(Hardware)
class BundleForm(ModelForm):
class Meta:
model = Bundle
fields = ('name', 'description', 'devices')
labels = {
'name': _('Bundlename'),
'description': _('Beschreibung des Bundle'),
'devices': _('Hardware im Bundle')
}
查看:
elif request.method == 'POST' and 'newbundle' in request.POST:
form = BundleForm(request.POST)
if form.is_valid():
bundle = form.save(commit=False)
bundle.save()
for hardware in bundle.devices.all():
print(hardware)
messages.success(request, 'Erfolg! Die Daten wurden erfolgreich gespeichert.')
return redirect('/knowledgeeditor/bundle/', {'messages': messages})
答案 0 :(得分:0)
您的问题不是迭代多对多字段,而是保存它们。
modelforms documentation有关于将commit=False
与多对多字段一起使用的说法:
当您的模型与另一个模型具有多对多关系时,可以看到使用
commit=False
的另一个副作用。如果模型具有多对多关系,并且在保存表单时指定commit=False
,则Django无法立即保存多对多关系的表单数据。这是因为在实例存在于数据库中之前,无法为实例保存多对多数据。要解决此问题,每次使用
commit=False
保存表单时,Django都会向您的ModelForm子类添加save_m2m()
方法。手动保存表单生成的实例后,可以调用save_m2m()
来保存多对多表单数据。
如上所述,你可以使用save_m2m()
来保存字段,但是你应该问自己为什么你在这里使用commit = False。没有理由这样做,所以你应该省略那个参数和随后的单独保存,然后让表单一次性保存。