带有ManyToManyField的Django ModelForm不会保存到DB

时间:2016-07-19 10:32:47

标签: django django-forms widget

我正在使用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字段留空,它确实显示错误,所以我猜它也检查它。)

可能是什么问题?

3 个答案:

答案 0 :(得分:1)

b是ManyToManyField,它保存在表A上。在另一个表中,保持A和B之间的关系。

答案 1 :(得分:1)

如果您有多对多字段,请参阅the documentation关于使用commit=False

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

答案 2 :(得分:1)

如果你有一个M2M字段并且保存(commit = False),你需要在最后调用它:

form.save_m2m()

请参阅docs