Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 保存除Django中的ManyToMany字段之外的新对象的所有内容_Python_Django_Django Models_Many To Many_Django 2.2 - Fatal编程技术网

Python 保存除Django中的ManyToMany字段之外的新对象的所有内容

Python 保存除Django中的ManyToMany字段之外的新对象的所有内容,python,django,django-models,many-to-many,django-2.2,Python,Django,Django Models,Many To Many,Django 2.2,我想保存具有多个关系的对象。当我提交表单时,除了有很多关系的字段之外,所有的东西都保存了 这些是我的文件: #Forms.py class ExamForm(ModelForm): class Meta: model = Exam fields = '__all__' #Models.py class Exam(models.Model): questions = models.ManyToManyField(Question) titl

我想保存具有多个关系的对象。当我提交表单时,除了有很多关系的字段之外,所有的东西都保存了

这些是我的文件:

#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)
这些代码有什么问题

如前所述,当您使用commit=False时,表单无法设置多对多关系,因为对象还没有ID。因此您需要调用表单的额外save_m2m方法:

但这里没有理由这么做。您不应该使用commit=False来立即保存模型。这适用于在保存之前要修改对象的情况,而此处不进行此操作。直接保存即可:

   if form.is_valid():
        form.save()
        return redirect('view_exam')

新的考试。保存m2m?谢谢,它很有效。但是,在保存之前添加一些修改对象怎么样?对于exmaple,如果我需要设置form.savecommit=False并在请求中添加以下行:`if'is\u allow\u comments'。POST:new\u exam.is\u allow\u comments=True,否则:new\u exam.is\u allow\u comments=False;我必须做什么@daniel rosemanAs我说过,那是你在新的考试后进行form.save\u m2m的时候。看见
   if form.is_valid():
        form.save()
        return redirect('view_exam')