Django:在保存从表单扩展的表单时使用 save(commit=false).形式



我有一个多对多字段,为了保存表单中检索到的数据,最初,我必须保存该表的实例,否则,我会收到如下错误:

">

顺序:无"需要具有字段"id"的值,然后才能使用此多对多关系。

但问题是当我调用了 2 个保存方法时,它们还会创建 2 个不同的日志(在第一个save()它创建实例,在字母一个它编辑它(,这会导致混乱。因此,我希望能够在第一个中commit=False并在第二个save()中完成保存。提交用于ModalForm,但是,我的表单扩展form.Forms

views.py

if request.method == 'POST':
form = OrderAddForm(request.POST)
if form.is_valid():
order = Order()
order.user = request.user
order.save()
order.ordered_materials.set(form.cleaned_data['ordered_materials'])
order.location = form.cleaned_data['location']
order.note = form.cleaned_data['note']
form.save()
else:
form = OrderAddForm()

forms.py

class OrderAddForm(forms.Form):
ordered_materials = forms.ModelMultipleChoiceField(
queryset=Material.objects.all(),
)
location = forms.CharField()
note = forms.CharField()
ordered_materials.widget.attrs.update({'id': 'materialsid',
'class': 'form-control',
})

models.py

class Order(models.Model):
user = models.ForeignKey(User,
on_delete=models.CASCADE)
ordered_materials = models.ManyToManyField('Material')
location = models.CharField(max_length=500)
note = models.CharField(max_length=30,
verbose_name="Note")
STATUS = (
('n', 'None'),
('a', 'Accepted'),
('r', 'Rejected'),
)
status_name = models.CharField(max_length=1,
choices=STATUS,
default='n')
def __str__(self):
return str(self.id)

设置多对多字段后不必保存对象。因此,您应该能够重新排列代码,以便只调用save()一次。

if form.is_valid():
order = Order()
order.user = request.user
order.location = form.cleaned_data['location']
order.note = form.cleaned_data['note']
order.save()
order.ordered_materials.set(form.cleaned_data['ordered_materials'])

最新更新