如何使用commit = False在Django上保存m2m字段?

时间:2017-06-24 13:47:18

标签: python django django-views

我希望能够保存m2m字段,但我遇到了一个问题,我遇到了这个错误:

  

ValueError ::" ..."需要有一个字段的值" id"在此之前可以使用多对多关系。

这是 models.py

class Font(models.Model):
    name = models.CharField(max_length=255)
    ...

class UserInfo(models.Model):
    organisation = models.CharField(max_length=255)
    font = models.ManyToManyField(Font)
    ...

我正在使用modelForm来处理多对多的字段。我用ajax获取我的值,这里是(pdb) request.POST的样子:

<QueryDict: {'fonts': ['2', '5', '6'], 'organisation': ['COMPANY'], 'csrfmiddlewaretoken': ['...']}>

'fonts'内的内容是Font的ID。

views.py

...
    save_it = form.save(commit=False)
    save_it.organisation = request.POST.get('organisation')

    for font in request.POST.getlist('fonts'):
        fonts = Font.objects.filter(id=font)
        save_it.font = fonts.first().id #error on save_it.font

    save_it.save()
    save_it.save_m2m()
...

forms.py

class UserInfoForm(forms.ModelForm):
    class Meta:
        model = UserInfo
        fields = ['organisation', 'fonts']

我做错了什么?

1 个答案:

答案 0 :(得分:1)

为了向前发展,我认为最好删除“#font”字体&#39;表格中的字段。它不知道如何处理它,你可能没有使用为它生成的HTML,因为字体是如何传输的。

您的视图代码将是这样的:

def form_valid(self, form):
    obj = form.save()
    for font_id in request.POST.getlist('fonts'):
        obj.font.add(Fonts.objects.get(id=font_id))