Python 尝试保存多对多字段数据时出现完整性错误

Python 尝试保存多对多字段数据时出现完整性错误,python,django,Python,Django,我有一个课程模型和一个学生数据模型。为了让学生参加课程,我在课程模型中添加了多对多字段。我可以用复选框列出学生,但问题是,当我按“注册”按钮将这些学生添加到课程中时,出现以下错误: #views.py 如果request.method==“POST”: 表单=课程表单(request.POST) 如果form.is_有效(): form.save() 重定向(“教室”) 其他: 表单=课程表单() #forms.py 课堂课程形式(forms.ModelForm): 类元: 模型=课程 字段=(

我有一个课程模型和一个学生数据模型。为了让学生参加课程,我在课程模型中添加了多对多字段。我可以用复选框列出学生,但问题是,当我按“注册”按钮将这些学生添加到课程中时,出现以下错误:

#views.py
如果request.method==“POST”:
表单=课程表单(request.POST)
如果form.is_有效():
form.save()
重定向(“教室”)
其他:
表单=课程表单()
#forms.py
课堂课程形式(forms.ModelForm):
类元:
模型=课程
字段=('student',)
小部件={
“学生”:forms.CheckboxSelectMultiple
}
#models.py
课堂学习程序(models.Model):
department=models.ForeignKey('department',on_delete=models.CASCADE)
name=models.CharField(最大长度=50)
研究类型=模型。整型字段(选项=((0,“学士研究”),
(1,“硕士研究”),
(2,“博士研究”),
(3,“综合研究”),默认值为0)
duration=models.PositiveSmallIntegerField(验证器=[MaxValueValidator(99)])
slug=models.SlugField(最大长度=140,唯一性=False,默认值=None,null=True,blank=True)
课堂课程(models.Model):
研究程序=models.ForeignKey('StudyProgramme',on\u delete=models.CASCADE,默认值=None)
name=models.CharField(最大长度=50,唯一性=True)
ects=models.PositiveSmallIntegerField(验证器=[MaxValueValidator(99)])
description=models.TextField()
年份=型号。阳性AllintegerField(验证器=[MaxValueValidator(99)])
学期=模型.IntegerField(选项=((1,“1”),
(2, "2"),
),默认值=无)
teacher1=models.ForeignKey('TeacherData',在_delete=models.CASCADE上,默认为无,
详细的“课程教师”,相关的“课程教师名称=”%(班级)s“课程教师”)
teacher2=models.ForeignKey('TeacherData',在_delete=models.CASCADE上,默认值=None,null=True,
详细的“研讨会教师”,相关的“名称=”%(班级)s“研讨会教师”)
slug=models.SlugField(最大长度=150,唯一性=True)
student=models.ManyToManyField('StudentData',默认值=None)
班级学生数据(models.Model):
name=models.CharField(最大长度=30)
姓氏=models.CharField(最大长度=50)
学生ID=models.CharField(唯一性=True,最大长度=14)
notes=models.CharField(最大长度=255,默认值=None,空白值=True)
登记=模型.BooleanField(默认值=False)
#enroll.html
{%csrf_令牌%}
{{form.as_p}}

问题是,如果我在每个字段中都添加null=True,那就没有意义了。

这里最简单的方法就是将学生传递到模板,并在模板中手动创建复选框,然后将值直接传递给课程

def enroll_students(request, course_slug):
    course = Course.objects.get(slug=course_slug)
    if request.method == 'POST':
        course.student.add(*request.POST.getlist('student_ids'))
        return redirect('...')
    return render(request, 'enroll_students.html', {'students': StudentData.objects.all()})


{学生百分比中的学生百分比}
{{student.name}
{%endfor%}

您的CourseForm仅包含student字段,但您的视图试图在保存时创建一个全新的课程。您需要获得您想要为学生注册的课程,并将其传递给要更新的表单。老实说,一个表单对于这个来说可能有些过分了。我还可以用什么来代替呢?我还认为使用表单也不太好。(*request.POST.getlist('student\u id'))这一行指的是学生id或学生id?因为我没有“学生id”。复选框起作用。学生甚至可以分页,我很高兴这也起作用,但如果我在管理中检查我的课程模型,似乎没有学生被选中。抱歉,我错过了HTML输入中的
名称
属性,请更新。如果我可以得到一个小更新..我怎样才能一次选择更多并更新那些选择的?而不是一个。抱歉,我不得不这样修改它:为了在页面中显示我想要的内容。因此学生的迭代超出了表单。有没有办法保持这种行为,但启用多个选择?
def enroll_students(request, course_slug):
    course = Course.objects.get(slug=course_slug)
    if request.method == 'POST':
        course.student.add(*request.POST.getlist('student_ids'))
        return redirect('...')
    return render(request, 'enroll_students.html', {'students': StudentData.objects.all()})
<form action="." method="POST">
{% for student in students %}
    <label for="id_{{ student.id }}">{{ student.name }}</label>
    <input type="checkbox" id="id_{{ student_id }}" value="{{ student.id }}" name="student_ids">

{% endfor %}
<input type="submit">
</form>