带有 ManyToManyField 的 Django ModelForm 不会保存到数据库

Django ModelForm with ManyToManyField wont save to DB

我将 Django 1.9 与以下内容一起使用:

views.py:

def a_new(request):
    # submit button
    if request.method == "POST":
        form = AForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()
            return redirect('ui:config-list')
    # first visit
    else:
        form = AForm()

    template = 'api/test_template.html'
    context = RequestContext(request, {'form': form})
    return render_to_response(template, context)

forms.py:

class AForm(forms.ModelForm):

     b= forms.ModelMultipleChoiceField(
         queryset=B.objects.all(),
         widget=FilteredSelectMultiple("b", is_stacked=False)
     )

     class Meta:
         model = A
         fields = ('name', 'b', )

test_template.html

...
<form role="form" class="form-inline" action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div>
        {{ form.name }}
        {{ form.b }}
    </div>


    <div class="dl-horizontal">
        <button type="submit" class="btn btn-success">Save</button>
    </div>
</form>

models.py:

class A(models.Model):
    name = models.CharField(max_length=100)
    b = models.ManyToManyField(B, null=True, blank=True, name='b')
 ...

问题是当我使用“保存”按钮时 - 仅在项目中创建了名称字段。正在使用小部件的 b 项目只是没有通过创建的新项目 A 保存到数据库中(如果我将 b 字段留空,它确实会显示错误,所以我猜它也在检查它)。

可能是什么问题?

b 是ManyToManyField,它确实保存在table A 上。在不同的table 中保持A 和B 之间的关系。

当你有一个多对多字段时,请参阅 the documentation 关于使用 commit=False

请注意,您没有理由在这里使用 commit=False。去掉它,第二次保存,Django会直接保存你的值。

如果您有一个 M2M 字段并执行 save(commit=False),您需要在最后调用它:

form.save_m2m()

参见docs