带有 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。
我将 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。