保存新对象的所有内容,除了 Django 中的 ManyToMany 字段
Save everything for new object except ManyToMany field in Django
我想保存具有 ManyToMany
关系的对象。当我提交表单时,除具有 ManyToMany
关系的字段外,所有内容都会保存。
这些是我的文件:
#Forms.py
class ExamForm(ModelForm):
class Meta:
model = Exam
fields = '__all__'
#Models.py
class Exam(models.Model):
questions = models.ManyToManyField(Question)
title = models.CharField(max_length=250)
class Question(models.Model):
title = models.CharField(max_length=250)
answer = models.TextField(null=True, blank=True)
#Views.py
def add_exam(request):
if request.method == "POST":
form = ExamForm(request.POST)
if form.is_valid():
new_exam = form.save(commit=False)
new_exam.save()
return redirect('view_exam')
else:
form = ExamForm()
template = 'add_exam.html'
context = {'form': form}
return render(request, template, context)
这些代码有什么问题?
正如docs所解释的那样,当您使用commit=False
时,表单无法设置多对多关系,因为该对象还没有ID。所以你需要调用表单的额外 save_m2m()
方法:
if form.is_valid():
new_exam = form.save(commit=False)
# Add some modifications
new_exam.save()
form.save_m2m()
return redirect('view_exam')
但是这里没有理由这样做。您不应该仅使用 commit=False
来立即保存模型。那是当你想在保存之前修改对象的时候,你在这里没有这样做。直接保存即可:
if form.is_valid():
form.save()
return redirect('view_exam')
我想保存具有 ManyToMany
关系的对象。当我提交表单时,除具有 ManyToMany
关系的字段外,所有内容都会保存。
这些是我的文件:
#Forms.py
class ExamForm(ModelForm):
class Meta:
model = Exam
fields = '__all__'
#Models.py
class Exam(models.Model):
questions = models.ManyToManyField(Question)
title = models.CharField(max_length=250)
class Question(models.Model):
title = models.CharField(max_length=250)
answer = models.TextField(null=True, blank=True)
#Views.py
def add_exam(request):
if request.method == "POST":
form = ExamForm(request.POST)
if form.is_valid():
new_exam = form.save(commit=False)
new_exam.save()
return redirect('view_exam')
else:
form = ExamForm()
template = 'add_exam.html'
context = {'form': form}
return render(request, template, context)
这些代码有什么问题?
正如docs所解释的那样,当您使用commit=False
时,表单无法设置多对多关系,因为该对象还没有ID。所以你需要调用表单的额外 save_m2m()
方法:
if form.is_valid():
new_exam = form.save(commit=False)
# Add some modifications
new_exam.save()
form.save_m2m()
return redirect('view_exam')
但是这里没有理由这样做。您不应该仅使用 commit=False
来立即保存模型。那是当你想在保存之前修改对象的时候,你在这里没有这样做。直接保存即可:
if form.is_valid():
form.save()
return redirect('view_exam')