在管理面板中,我可以将人员添加到我的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数据包含人员数据,但未写入数据库。我很难过。请帮忙!
答案 0 :(得分:1)
只有fields
元组中命名的字段才会保存到实例中。你没有在那里列出你的m2m字段。
您还可以使用不同的名称定义modelchoicefield - class_persons而不是person。事实上,根本没有理由单独定义该字段 - 您没有更改默认值中的任何属性。
一旦您删除了该定义,也没有理由覆盖__init__
,因为您从未传递用户参数,也不会在表单中的任何位置使用它。