Django迭代多个对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django迭代多个对象相关的知识,希望对你有一定的参考价值。
我的主要问题是我的代码永远不会进入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})
答案
您的问题不是迭代多对多字段,而是保存它们。
modelforms documentation有关于使用commit=False
与多对多字段的说法:
当您的模型与另一个模型具有多对多关系时,可以看到使用
commit=False
的另一个副作用。如果您的模型具有多对多关系,并且在保存表单时指定commit=False
,则Django无法立即保存多对多关系的表单数据。这是因为在实例存在于数据库中之前,无法为实例保存多对多数据。要解决此问题,每次使用
commit=False
保存表单时,Django都会向您的ModelForm子类添加save_m2m()
方法。手动保存表单生成的实例后,可以调用save_m2m()
来保存多对多表单数据。
如前所述,你可以使用save_m2m()
来保存字段,但是你应该问问自己为什么你在这里使用commit = False。没有理由这样做,所以你应该省略该参数和随后的单独保存,然后让表单一次性保存。
以上是关于Django迭代多个对象的主要内容,如果未能解决你的问题,请参考以下文章
Django'logout'TypeError:'AnonymousUser'对象不可迭代