Python CreateView没有';无法保存相关对象

Python CreateView没有';无法保存相关对象,python,django,Python,Django,我有两个模型:学生模型和小组模型。一个组由多个学生组成,一个学生只能在一个组中。以下是模型: class Group(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Student(models.Model): first_name = models.CharField(ma

我有两个模型:学生模型和小组模型。一个组由多个学生组成,一个学生只能在一个组中。以下是模型:

class Group(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Student(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    section = models.PositiveSmallIntegerField(default=1)
    group = models.ForeignKey(
        Group, on_delete=models.SET_NULL, null=True, blank=True
    )
我正在尝试建立一个表格,我可以选择多个学生来创建一个小组

class CreateGroupForm(forms.ModelForm):
    students = forms.ModelMultipleChoiceField(
        required=True,
        queryset=Student.objects.all()
    )

    class Meta:
        model = Group
        fields = ('students', )
我对表单使用以下视图:

class SelectGroup(CreateView):
    model = Group
    form_class = CreateGroupForm
    template_name = 'selection.html'
    success_url = reverse_lazy('test')

当我提交表单时,它会创建一个组,但该组的student_集为空。我猜这是因为我无法在不先保存组的情况下将学生添加到组中。我是否有办法修改此视图以保存学生或使用其他内容?

由于
学生
不是组模型的字段,因此模型表单的
保存
不知道如何处理它。您必须重写
save
方法并手动处理
students
字段:

class CreateGroupForm(forms.ModelForm):
    # ...
    def save(self, commit=True):
        # you have to commit, else the reverse fk has nothing to point to
        group = super(CreateGroupForm, self).save(commit=True)
        group.student_set.add(*self.cleaned_data['students'])
        return group
如果不希望删除表单上的“非提交保存”选项,还可以覆盖视图的方法:

class SelectGroup(CreateView):
    # ...
    def form_valid(self, form):
        self.object.student_set.add(*self.form.cleaned_data['students'])
        return super(SelectGroup, self).form_valid(form)

由于
学生
不是组模型的字段,因此模型表单的
保存
不知道如何处理它。您必须重写
save
方法并手动处理
students
字段:

class CreateGroupForm(forms.ModelForm):
    # ...
    def save(self, commit=True):
        # you have to commit, else the reverse fk has nothing to point to
        group = super(CreateGroupForm, self).save(commit=True)
        group.student_set.add(*self.cleaned_data['students'])
        return group
如果不希望删除表单上的“非提交保存”选项,还可以覆盖视图的方法:

class SelectGroup(CreateView):
    # ...
    def form_valid(self, form):
        self.object.student_set.add(*self.form.cleaned_data['students'])
        return super(SelectGroup, self).form_valid(form)