我的FormMultipleChoiceField表单不保存数据。

时间:2017-03-27 04:42:05

标签: python django

在管理面板中,我可以将人员添加到我的CompleteClass模型中。 CompleteClass和Person之间存在M2M关系。但是,我的形式并没有发挥作用。 pub_date将更新,我可以保存head_count,但不能保存ModelMultipleChoiceField(人员) - 它不会保存。

models.py

class Person(models.Model):
    name = models.CharField(max_length=255)
    persona_description = models.CharField(max_length=255)
    def __str__(self):
        return self.name

class CompleteClass(models.Model):
    persons = models.ManyToManyField(Person)
    class_name = models.CharField(max_length=255)
    class_head_count = models.IntegerField()
    class_pub_date = models.DateField()

    def __str__(self):
        return '%s %s' % (self.class_name, self.class_head_count)

    def save_complete_class(self):
        self.class_pub_date = timezone.now()
        self.save()

    class Meta:
        ordering = ('class_pub_date',)

这是views.py:

def class_new(request):
    if request.method == "POST":
        form = CompleteClassForm(request.POST)
        if form.is_valid():
            complete_class = form.save(commit=False)
            complete_class.class_pub_date = timezone.now()
            complete_class.save()
            form.save_m2m()
            return redirect('class_detail', pk=complete_class.pk)
    else:
        form = CompleteClassForm()
    return render(request, 'app/class_edit.html', {'form': form})

和forms.py

class CompleteClassForm(forms.ModelForm):
    class Meta:
        model = CompleteClass
        fields = ('class_name', 'class_head_count',)
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(CompleteClassForm, self).__init__(*args, **kwargs)
        self.fields['class_persons']=forms.ModelMultipleChoiceField(queryset=Person.objects.all())

我已阅读文档并使用了save_m2m,因为我设置了commit = false。

POST数据包含人员数据,但未写入数据库。我很难过。请帮忙!

1 个答案:

答案 0 :(得分:1)

只有fields元组中命名的字段才会保存到实例中。你没有在那里列出你的m2m字段。

您还可以使用不同的名称定义modelchoicefield - class_persons而不是person。事实上,根本没有理由单独定义该字段 - 您没有更改默认值中的任何属性。

一旦您删除了该定义,也没有理由覆盖__init__,因为您从未传递用户参数,也不会在表单中的任何位置使用它。