在Django中,我在can_order = True
设置order_with_respect_to
的模型上使用带有_order
的inlineformset。我在前端设置拖放,这导致Django的自动生成的ORDER表单字段(我隐藏)更改以反映新订单。我已经验证我正在将新订单正确地发布到服务器,但Django似乎忽略了它,并按原始顺序保存模型。数据库中自动创建的save()
字段永远不会更改。
如何让Django使用formset中指定的顺序保存模型?除了在formset上调用{{1}}之外,我还需要做一些特别的事吗?
答案 0 :(得分:4)
Evan Borgstrom建议解决方案不能与can_delete = True一起使用。
这是我的解决方案,也适用于can_delete = True:
for instance in formset.save(commit=False):
# ... do something with m2m relationships ...
for form in formset.ordered_forms:
form.instance.order = form.cleaned_data['ORDER']
form.instance.save()
答案 1 :(得分:2)
我遇到了同样的问题,经过挖掘Django的消息来源认为这是你需要自己做的事情。
我原来的实现看起来像这样:
services = service_formset.save(commit=False)
for service in services:
# ... do something with m2m relationships ...
service.save()
但是,正如您所发现的那样,这不会设置ORDER。所以我的实现现在看起来像:
for form in service_formset:
service = form.save(commit=False)
# ... do something with m2m relationships ...
service.order_order = form.cleaned_data['ORDER']
service.save()
在上面的示例中,'order_order'是我用来跟踪模型上的顺序的字段。
还要记住,您需要指定模型的Meta类的“ordering”属性,以确保在再次生成formset时元素的顺序正确。
class Service(models.Model):
# ...
order_order = models.IntegerField(default=0)
class Meta:
ordering = ['order_order',]