Django迭代多个对象

时间:2018-03-04 20:17:52

标签: django django-models django-forms

我的主要问题是我的代码永远不会进入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})

1 个答案:

答案 0 :(得分:0)

您的问题不是迭代多对多字段,而是保存它们。

modelforms documentation有关于将commit=False与多对多字段一起使用的说法:

  

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

     

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

如上所述,你可以使用save_m2m()来保存字段,但是你应该问自己为什么你在这里使用commit = False。没有理由这样做,所以你应该省略那个参数和随后的单独保存,然后让表单一次性保存。